UVALive 6283 Great Deceiver 思考题

来源:互联网 发布:量子通信网络快吗 编辑:程序博客网 时间:2024/06/07 13:52

题意:给定一个n和k,求所有小于等于n的数中k进制和-k进制的值相等的有多少个组合使得xk==xk
xk=a0k0+a1k1+...+arkr
xk=a0(k)0+a1(k)2+...+ar(k)r

显然之后项数为奇或者幂为偶数的那些项相同才能使得k进制和-k进制都相同 也就是
对于n=a0k0+a1k1+a2k2+...+arkr
有多少个x=b0k0+b1k1+b2k2+...+brkr
并且xn
从最高位考虑,
1)若r为奇数,并且ar>0那么就是kr/2,否则转2)
2)若r为偶数,那么
1.考虑br[0,ar1]的情况,一共有arkar/21
2.考虑brar的情况,就是这一位一定定下,求r1位种数,转1)

代码:

#include <iostream>#include <cstdio>using namespace std;typedef long long LL;LL K,n,tk[100000],res[100000];LL dfs(int bpos){    if(bpos%2==0){        if(res[bpos]) return tk[bpos/2];        else return dfs(bpos-1);    }    return res[bpos]*tk[bpos/2]+dfs(bpos-1);}int main(){    while(~scanf("%lld%lld",&n,&K)){        tk[0]=1;        for(int i=1;;i++){            tk[i]=tk[i-1]*K;            if(tk[i-1]*K>n)break;        }        LL tn=n;        res[0]=0;        while(tn>0){            res[++res[0]]=tn%K;            tn=tn/K;        }        //if(n==0)res[++res[0]]=0;        //printf("res0:%lld\n",res[0]);        //for(int i=res[0];i>=1;i--)printf("%lld ",res[i]);        //puts("");        printf("%lld\n",dfs(res[0]));    }    return 0;}
0 0
原创粉丝点击