您的位置:首页 > 产品设计 > UI/UE

UVA 10479 The Hendrie Sequence

2017-08-25 21:27 246 查看
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;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: