UVA 10479 The Hendrie Sequence 规律
2015-05-01 23:05
309 查看
题目大意:一个序列,刚开始由0变到了1,接着往后一个个变化下去
变化的规则是,如果当前数是k,就在这个序列的最后面加上k-1个0,再加上k+1
现在问这个序列的第n个数是多少
解题思路:这是有规律的,第2的k次方个数刚好是k
如果当前数是k,且k刚好是2的n次方,那么这个数前面就有n-1个0,n-2个1,n-3个02组合,以此类推
如果要求第n个数是多少,只需要找到n是哪个k之前的,然后依照上面的规律依次递归下去即可
变化的规则是,如果当前数是k,就在这个序列的最后面加上k-1个0,再加上k+1
现在问这个序列的第n个数是多少
解题思路:这是有规律的,第2的k次方个数刚好是k
如果当前数是k,且k刚好是2的n次方,那么这个数前面就有n-1个0,n-2个1,n-3个02组合,以此类推
如果要求第n个数是多少,只需要找到n是哪个k之前的,然后依照上面的规律依次递归下去即可
[code]#include<cstdio> #include<cstring> using namespace std; #define maxn 64 typedef unsigned long long ull; ull pos[maxn], num[maxn]; void init() { num[0] = num[1] = 1; for(int i = 2; i < maxn; i++) num[i] = num[i - 1] * 2; pos[1] = 2; for(int i = 2; i < maxn; i++) pos[i] = pos[i - 1] * 2; } int dfs(ull len, int n) { if(len == 0) { return n; } int now = 0; for(int i = n - 1; i > 0; i--) { if(len > i * num[now]) len -= i * num[now]; else { if(now == 0 || now == 1) { return now; } len = (len - 1) % num[now]; return dfs(len, now); } now++; } } int main() { init(); long long n; while(scanf("%lld", &n) == 1 && n) { if(n == 1) { printf("0\n"); continue; } for(int i = 1; i <= 64; i++) { if(n <= pos[i]) { printf("%d\n", dfs(pos[i] - n, i)); break; } } } }
相关文章推荐
- uva 10479 - The Hendrie Sequence(规律+递归)
- UVA 10479 - The Hendrie Sequence(规律+递归)
- The Hendrie Sequence UVA - 10479
- uva 10479——The Hendrie Sequence
- uva 10479(找规律+递归)
- UVA 10479 The Hendrie Sequence
- uva 10479(找规律+递归)
- UVa 10534 DP LIS Wavio Sequence
- UVALive 6862 Triples (找规律 暴力)
- uva12716 GCD XOR(打表找规律+筛法)
- UVa 102 - Ecological Bin Packing(规律,统计)
- uva694 The Collatz Sequence
- UVA 348 Optimal Array Multiplication Sequence 最优矩阵链乘 区间DP
- uva 11525(规律+单点更新)
- UVALive 7045 Last Defence(找规律)
- UVa11582 - Colossal Fibonacci Numbersl (打表找规律)
- UVa11040 - Add bricks in the wall (规律递推)
- 紫书数论例题10-5 uva 12716 找规律
- UVA 1482 - Playing With Stones(SG打表规律)
- UVALive 6174 Pen Counts 规律