UVA 10479 The Hendrie Sequence

https://vjudge.net/problem/UVA-10479

 

打表找规律: 

1、根据n可以确定第n项在上表中第i行

2、减去前i-1行,就得到了n在第i行的第j个

3、第i行的规律:1个i-2行,2个i-3行,3个i-4行……

转化为子问题继续下去

 

 

#include<cstdio>
#include<iostream>
using namespace std;
typedef unsigned long long LL;
LL bit[65],z[65];
int main()
{
    LL n,sum;
    int r,num,cnt;
    for(LL i=0;i<=63;i++) bit[i]=1ll<<i;
    z[0]=z[1]=1;
    for(int i=2;i<=63;i++) z[i]=z[i-1]<<1;
    while(cin>>n)
    {
        if(!n) return 0;
        int i;
        for(i=0;;i++)
            if(bit[i]>n) break;
        n-=bit[i-1];
        if(!n) { printf("%d\n",i-1); continue;}
        r=i;
        while(n)
        {
            if(r==0) { printf("0\n"); break; }
            if(r==1)  { printf("1\n"); break; }
            sum=0;
            for(num=r-2,cnt=1;num>=0;num--,cnt++)
                if(sum+z[num]*cnt>=n) break;
                else sum+=z[num]*cnt;
            n-=sum;
            while(cnt && n>=z[num]) n-=z[num],cnt--;
            if(!n) printf("%d\n",num);
            r=num;
        }
    }
}

 

posted @ 2017-08-25 21:27  TRTTG  阅读(473)  评论(0编辑  收藏  举报