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;

}

 

你可能感兴趣的:(序列)