1057. Amount of Degrees
Time limit: 1.0 second
Memory limit: 64 MB
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. 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
|
代码:
#include <iostream>
#include <cstring>
#include <stdio.h>
using namespace std;
int dp[40][40];
int X,Y,K,B;
void init()
{
dp[0][0]=1;
for(int i=1;i<=35;i++)
{
dp[i][0]=dp[i-1][0];
for(int j=1;j<=35;j++)
dp[i][j]=dp[i-1][j]+dp[i-1][j-1];
}
}
int change(int k)
{
int tot=0,ans=0;long long tool=1;
while((tool*B)<=k){
tool*=B;tot++;
}
while(tool)
{
if(k>=tool)
ans+=(1<<tot),k-=tool;
tool/=B;tot--;
}
return ans;
}
int getans(int t,int k)
{
int tot=0,ans=0;
for(int i=30;i>=0;i--){
if(tot>k)break;
if(t&(1<<i))
ans+=dp[i][k-tot],tot++,t-=(1<<i);
}
if(tot==k) ans++;
return ans;
}
int main()
{
init();
while(scanf("%d%d%d%d",&X,&Y,&K,&B)==4){
cout<<getans(change(Y),K)-getans(change(X-1),K)<<endl;
}
return 0;
}