1083 Cantor表
1999年NOIP全國聯賽普及組 時間限制: 1 s 空間限制: 128000 KB 題目等級 : 白銀 Silver 題目描述 Description
現代數學的著名證明之一是Georg Cantor證明了有理數是可枚舉的。他是用下面這一張表來證明這一命題的: 1/1 1/2 1/3 1/4 1/5 … 2/1 2/2 2/3 2/4 … 3/1 3/2 3/3 … 4/1 4/2 … 5/1 … … 我們以Z字形給上表的每一項編號。第一項是1/1,然後是1/2,2/1,3/1,2/2,… 輸入描述 Input Description
整數N(1≤N≤10000000) 輸出描述 Output Description
表中的第N項 範例輸入 Sample Input
7 範例輸出 Sample Output
1/4 資料範圍及提示 Data Size & Hint
見描述
#include<iostream>#include<cstdio>#include<cmath>using namespace std;long long n;int erfen(){int left=1,right=1500;int mid;while(left+1<right){mid=left+(right-left)/2;long long ans=(mid*mid-mid)/2+1;if(ans>n)right=mid;else if(ans==n)return mid;else left=mid;}return left;}int main(){scanf("%d",&n);int num=erfen();if(!(num%2)){int k=n-(num*num-num)/2;printf("%d/%d",k,num+1-k);}else{int k=n-((num*num-num))/2;printf("%d/%d",num+1-k,k);}return 0;}
將這個東西順時針旋轉一下成三角形,第n行最左邊數位編號n*(n-1)/2+1。奇數行從左往右數,偶數行從右往左走。
根據上述小學奧數推論寫程式即可。仍有疑惑請下方評論,每周三下午||周日晚上||大休||節假日回覆。