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

习题 10-23 UVA - 10479 The Hendrie Sequence

2016-03-22 22:57 423 查看
大体题意:

H (1) = 0;

然后把每一个数字X都改成X个0加上X+1的形式,问最后第n个值是多少!(注意可以不是个位数!)

思路:

看了好久,还是从题解发现的规律。

规律:

第2 ^ K 一定是K,然后这个K前面有K - 1个0,K-2个1,K-3个02.。。。。。依次类推 直到K - n = 1。

这样写出长度足够长的Hn来之后可以发现,每一个数字前面的规律都符合上述规律。

所以递归就好了!

先找到第一个K 满足 2^K 刚好满足 2^ K大于n,那么len = 2^k-n, 如果len = 0,则返回n,否则不断的减掉k-1个0,k-2个1.。。。

最后不断递归不能再减的那个数字即可!

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 65;
typedef unsigned long long llu;
llu p[maxn],lent[maxn];
void init(){
p[1] = 2;
lent[0] = lent[1] = 1;
for (int i = 2; i < maxn; ++i){
p[i] = p[i-1]*2;
lent[i] = lent[i-1]*2;
}
}
llu dfs (llu len,llu n){
if (len == 0)return n;
llu cnt=0;
for (int i = n-1 ; i >= 1; --i){
if (len > i*lent[cnt]){
len -= i*lent[cnt];
++cnt;
}
else {
for (int j = 0;;++j){
if (len > lent[cnt])len -=  lent[cnt];
else break;
}
if (cnt == 1 || cnt == 0)return cnt;
return dfs(len-1,cnt);
}
}
}
int main(){
llu n;
init();
while(scanf("%llu",&n) == 1 && n){
if (n == 1){
printf("0\n");
continue;
}
for (int i = 1; i < maxn; ++i){
//printf("%llu\n",lent[i]);
if (p[i] >= n){
//printf("%llu\n",p[i]);
printf("%llu\n",dfs(p[i]-n,i));
break;
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: