泥豪!我是2789617221guo!欢迎来|

2789617221guo

园龄:1个月粉丝:2关注:2

2025-02-09 22:07阅读: 14评论: 0推荐: 0

洛谷P1014[NOIP 1999 普及组] Cantor 表 题解

P1014[NOIP 1999 普及组] Cantor 表 题解

题目

题目传送门

题解

思路

这是一道有意思的经典递推题目。

通过肉眼观察和枚举样例理解,不难发现,第\(x\)条“/”斜线上有\(x\)项元素,当\(x\mod2=0\)时,第\(i\)\(a_i\)/\(b_i\)中的分子\(a\)是从1递增到\(x\)的,分母\(b\)是从\(x\)递减到1;反之同理,当\(x\mod2=1\)时,\(a\)\(x\)递减到1,\(b\)从1递增到\(x\)

使用一个while循环\(while(!ok)\)\(ok\)初值为0。定义一个变量\(l\)表示当前在第\(l\)条斜线上,当\(l\mod2=0\)时,内部while循环为\(while(a<l)\),否则循环为\(while(b<l)\)
每次外部while循环内,先是依据\(l\mod2\)的结果判断,如果\(l\mod2=0\),则\(a=0,b=l+1\),否则\(a=l+1,b=0\),其次在内部while循环内,当\(l\mod2=0\)时,每次\(a++,b--\),否则每次\(a--,b++\),每次操作完后,进行计数器自增\(cnt++\),若\(cnt=n\)(即已经求到第\(n\)项了),就将\(ok\)设置为1并break,否则在每次内部while循环结束后,将\(l++\)

最后输出\(a\)/\(b\)即可。

代码

#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
const long long INF = 0x3f3f3f3f;
const double EPS = 1e-8;
int n;
bool ok;
int main(){
cin>>n;
int cnt=0,l=1,a=0,b=2;
while(!ok){
if(l%2==0) {
a=0;
b=l+1;
}else{
a=l+1;
b=0;
}
while((l%2==0?(a<l):(b<l))){
if(l%2==0) {
a++;
b--;
}else{
a--;
b++;
}
cnt++;
if(cnt==n){
ok=1;
break;
}
}
l++;
}
cout<<a<<'/'<<b<<endl;
return 0;
}

本文作者:2789617221guo

本文链接:https://www.cnblogs.com/2789617221guo/p/18706794

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   2789617221guo  阅读(14)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起