前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【NOIP1999 普及组T1】 Cantor 表

【NOIP1999 普及组T1】 Cantor 表

作者头像
pai233
发布2022-01-12 17:05:13
2960
发布2022-01-12 17:05:13
举报
文章被收录于专栏:pai233的专栏

一道水模拟,可以直接算。但菜鸡不会……

题目大意

原题导航:https://www.luogu.com.cn/problem/P1014

一个表格: 1/11/11/1 , 1/21/21/2 , 1/31/31/3 , 1/41/41/4, 1/51/51/5 …

2/12/12/1, 2/22/22/2 , 2/32/32/3, 2/42/42/4…

3/13/13/1 , 3/23/23/2, 3/33/33/3…

4/14/14/1, 4/24/24/2…

5/15/15/1…

按照Z字型排列,即:

问第NNN项是什么。

做法

这样的表格比较难看,我们先把它转换一下:

11\frac{1}{1}11​

12,21\frac{1}{2},\frac{2}{1}21​,12​

31,22,13\frac{3}{1},\frac{2}{2},\frac{1}{3}13​,22​,31​

14,23,32,41\frac{1}{4},\frac{2}{3},\frac{3}{2},\frac{4}{1}41​,32​,23​,14​

.........

这样将每一行都分离了出来,可以发现,每行的数的数量形成了等差数列。第一行有111个数,第二行有222个数……

那么,我们就要将第NNN项所在行找出来:

代码语言:javascript
复制
int add=1;
while(n>add){
    n-=add;//倒数第几个
    add++;//第几行,也表示当前行有几个
}

当然,这个可以直接算出来,没有必要暴力枚举,但数据太水了,依旧可以过。

知道它是第几行的,我们就要看他是什么了。不难发现,当add是奇数的时候,add分母依次为从111递增到add的数列,分子为从add递减至111的数列;而当add是偶数的时候,add分子依次为从111递增到add的数列,分母为从add递减至111的数列。

可以得到以下的代码:

代码语言:javascript
复制
//add为当前行数的数量,n是倒数第几个,最后别忘了+1
//可以自己算算看看
if(add%2==1){
    printf("%d/%d",add-n+1,n);
}else{
    printf("%d/%d",n,add-n+1);
}

完整AC代码:

代码语言:javascript
复制
#include<bits/stdc++.h>
using namespace std;
int main(){
    int n;
    scanf("%d",&n);
    int add=1;
    while(n>add){
        n-=add;
        add++;
    }
    if(add%2==1){
        printf("%d/%d",add-n+1,n);
    }else{
        printf("%d/%d",n,add-n+1);
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-10-142,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目大意
  • 做法
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档