设为首页 加入收藏

TOP

uva 10479(找规律+递归)
2015-11-21 00:57:32 来源: 作者: 【 】 浏览:2
Tags:uva 10479 规律 递归

题意:有一个初始序列第一个数字是0,
规律是把前一次推出来的每一个数字x,先接x个0,然后接x+1。
0 –> 1 –> 02 –> 1003 –> 02110004
那么这个序列就变成0,1,0,2,1,0,0,3,0,2,1,1,0,0,0,4…
问序列里第n个数字是多少,0 < n < 2^63。

题解:首先可以看出这个序列的第2^k个数字一定是k,然后从第2^k个数字往前看一定是紧接着k-1个0,k-2个1 ,k-3个02,k-4个1003…,一直到k-i为1,把n在k-i这个序列的循环节中位置找到,然后递归下去直到可以确定它的值。

#include 
   
     #include 
    
      #define ll unsigned long long ll n, f[65]; void dfs(int r, ll cur, ll len) { if (cur >= len - (r - 1)) { printf(0 ); return; } len = len - (r - 1); for (int i = 1, j = r - 2; j > 0; i++, j--) { if (cur >= len - j * f[i - 1]) { cur = ((cur - (len - j * f[i - 1])) % f[i - 1]) + 1; len = f[i - 1]; if (cur == len) printf(%d , i); else dfs(i, cur, len); return; } len = len - j * f[i - 1]; } } int main() { f[0] = 1; for (int i = 1; i < 64; i++) f[i] = f[i - 1] * 2; while (scanf(%lld, &n) == 1 && n) { int l; for (int i = 0; i < 64; i++) { if (n < f[i]) { l = i - 1; break; } } if (f[l] == n) printf(%d , l); else { int r = l + 1; dfs(r, n, f[r]); } } return 0; }
    
   

?

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇UVALive - 2031 Dance Dance Revo.. 下一篇codeforces 534B Covered Path-思..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: