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