Create a code to determine the amount of integers, lying in the set [
X;
Y] and being a sum of exactly
K 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 = 2
4+2
0,
18 = 2 4+2 1,
20 = 2 4+2 2.
18 = 2 4+2 1,
20 = 2 4+2 2.
Input
The first line of input contains integers
X and
Y, separated with a space (1 ≤
X ≤
Y ≤ 2
31−1). The next two lines contain integers
K and
B (1 ≤
K ≤ 20;2 ≤
B ≤ 10).
Output
Output should contain a single integer — the amount of integers, lying between
X and
Y, being a sum of exactly
K different integer degrees of
B.
Sample
input | output |
---|---|
15 20 2 2 | 3 |
分析: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));
}
}