P1014 Cantor表
题解
注意几个问题就好啦
1.注意它的编号顺序
2.处理边界
3.枚举多少层??
等差数列可得: n>=(1+m)* m / 2 (这个是根据这个题来的,正规的等差数列公式不是这个)
所以 1+m >= sqrt( 2n )
所以枚举 sqrt(m*2)+1 一定没问题,也不会炸
代码
#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> using namespace std; struct node { int fz,fm,num; }f[5000][5001]; long long n,m,cnt; int main() { scanf("%d",&m); n=sqrt(m*2)+1; for(int i=0;i<=n;i++) { f[i][0].fz =i+1; f[i][0].fm =0; f[i][i+1].fm =i+1; f[i][i+1].fz =0; } for(int i=1;i<=n;i++) for(int j=1;j<=i;j++) { f[i][j].fz =f[i-1][j-1].fz ; f[i][j].fm =f[i-1][j].fm ; } for(int i=1;i<=n;i++) { if(i%2==1) { for(int j=1;j<=i;j++) { cnt++; if(cnt==m) { printf("%d/%d\n",f[i][j].fz,f[i][j].fm); return 0; } } } else if(i%2==0) { for(int j=i;j>=1;j--) { cnt++; if(cnt==m) { printf("%d/%d\n",f[i][j].fz,f[i][j].fm); return 0; } } } } }