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

P1014 [NOIP 1999 普及组] Cantor 表

题目描述

现代数学的著名证明之一是 Georg Cantor 证明了有理数是可枚举的。他是用下面这一张表来证明这一命题的:

我们以 Z 字形给上表的每一项编号。第一项是 1/1,然后是 1/2,2/1,3/1,2/2,…

输入格式

整数N(1< N <10^7)。

输出格式

表中的第N项。

输入输出样例 #1

输入 #1

7

输出 #1

1/4

思路

首先注意到数排顺序是按照蛇形来的,而且第i斜行所有数分子分母之和为i+1.
某序号N对应的行数i可以根据等差数列来

while(sum<N){
		i++;
		sum+=i;
	} 

这个会找到序号N所在行数i,以及前面前i行个数之和sum
则前i-1行个数之和为sum-i
一行数从i/1或i/i开始,每次分子分母加减一,从开头到N就是加减N-sum+i-1
所以得出第N个数字是N-sum+i/i-(N-sum+i-1)(因为蛇形排序,奇数行分子分母刚好反过来)
代码如下

#define LOCA
#include<stdio.h>
int main(){
	#ifdef LOCAL
	freopen("in.txt","r",stdin);
	freopen("out.txt","w",stdout);
	#endif 
	int N;
	scanf("%d",&N);
	int i=1,sum=1;
	while(sum<N){
		i++;
		sum+=i;
	} 
	if(i%2==0){
		printf("%d/%d",N-sum+i,i-N+sum-i+1);
	}
	else{
		printf("%d/%d",i-N+sum-i+1,N-sum+i);
	}
}
posted @ 2025-07-07 15:29  hardestnut  阅读(53)  评论(0)    收藏  举报