http://acm.fafu.edu.cn/problem.php?id=1252
View Code
//fafu 1252 指数幂序列 //这题题意很清楚,3的正整数指数幂序列1, 3, 9, 27, 81, ... //则第 i 小的组合分别为{1},{3},{1,3},{9},{1,9},{3,9},{1,3,9}... //若第i 小的组合 的最大一个数位 n 则前面所有数和来的大,这个可以 //自己推看看(我没推出来,不过自己列一些组合出来,再yy下,应该是这样的) //因此可用2 进制数做标记位,如 第2 小的二进制数位 1 表示这一位的 //指数幂在组合里;第5小的组合可表示为 101 表示需要3的 0次幂和2次幂... //这题的 次幂是 从0次幂开始的,刚开始没注意看,样例一直过不了,纠结了好久 //还有就是要用大数,具体看代码 #include <stdio.h> #include <string.h> #define N 70 int num[N][1000], len[N]; int main() { num[0][1] = 1; len[0] = 1; for(int i = 1; i < N; ++i) //打表 { int more = 0; //记录进位 多少 len[i] = len[i-1]; //记录 i次幂的数有多长 for(int j = 1; j <= len[i-1]; ++j) //大数 { num[i][j] = num[i-1][j] * 3 + more; more = 0; if(num[i][j] >= 10) { more = num[i][j] / 10; num[i][j] %= 10; } } if(more != 0) //看最后是否有进位 { num[i][ ++len[i] ] = more; } } unsigned __int64 n; while(scanf("%I64d", &n) != EOF) { int cnt = 0; bool flag = false; while(n) { if(n & 1 == 1)//看二进制位是否为1 { if(flag == true) putchar(','); flag = true; for(int i = len[cnt]; i >= 1; --i) printf("%d", num[cnt][i]); } cnt++; //标记二进制位第几位,即cnt次幂 n >>= 1; } puts(""); } return 0; }