fafu 1252 指数幂序列

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;
}

 

posted @ 2012-04-23 19:16  gabo  阅读(216)  评论(0编辑  收藏  举报