P1014 Cantor表

 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;
                }
            }
        }
    }
 
}

 

posted @ 2019-06-14 10:19  晔子  阅读(155)  评论(0编辑  收藏  举报