Ural 1057. Amount of Degrees

来源:互联网 发布:软件开发求职能力 编辑:程序博客网 时间:2024/06/06 19:43

Create a code to determine the amount of integers, lying in the set [X;Y] and being a sum of exactlyK different integer degrees of B.
Example. Let X=15, Y=20,K=2, B=2. By this example 3 numbers are the sum of exactly two integer degrees of number 2:
17 = 24+20,
18 = 24+21,
20 = 24+22.

Input

The first line of input contains integers X andY, separated with a space (1 ≤ X ≤ Y ≤ 231−1). The next two lines contain integersK and B (1 ≤ K ≤ 20;2 ≤ B ≤ 10).

Output

Output should contain a single integer — the amount of integers, lying betweenX and Y, being a sum of exactly K different integer degrees ofB.

Sample

inputoutput
15 2022
3
题目大意:在X~Y区间找出由K个B的幂组成的数的个数,幂的系数为1。
分析:X~Y区间B进制数仅含K个1,且其他位为0的数的个数。

#include<iostream>#include<cstdio>#include<cmath>#include<cstring>#include<queue>using namespace std;typedef long long LL;int sum[34];int dp[34][34];int x,y,k,b;int dfs(int pos, int num, bool limit){    if(pos<=0) return num==k;    if(num>k) return 0;    if(!limit && dp[pos][num]!=-1) return dp[pos][num];    int end=limit?(sum[pos]?1:0):1;    int ans=0;    for(int i=0;i<=end;i++)        ans+=dfs(pos-1,num+i,limit&&i==sum[pos]);    if(!limit) dp[pos][num]=ans;    return ans;}int wcb(int n){    int p=0;    while(n)    {        sum[++p]=n%b;        n/=b;    }    return dfs(p,0,true);}int main(){    int i,j;    while(scanf("%d%d%d%d",&x,&y,&k,&b)==4)    {        memset(dp,-1,sizeof(dp));        printf("%d\n",wcb(y)-wcb(x-1));    }}


0 0
原创粉丝点击