简单数位DP,统计在【L,R】之间的能用B进制且一共有K位是1的数一共有多少。
1057. Amount of Degrees
Time limit: 1.0 second
Memory limit: 64 MB
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.
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 |
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
int l,r,n,b;
int f[35][35];
int y[35];
void init()
{
f[0][0]=1;
for (int i=1;i<=31;++i)
{
f[i][0]=f[i-1][0];
for (int j=1;j<=i;++j) f[i][j]=f[i-1][j]+f[i-1][j-1];
}
}
int calc(int x,int k)
{
int tmp=x,p=0;
int tot=0,ans=0;
memset(y,0,sizeof(y));
while(tmp)
{
y[p++]=tmp%b;
tmp/=b;
}
bool ok=1;
for(int i=p-1;i>=0;i--)
{
if(y[i]==1)
{
ans+=f[i][k-tot];
tot++;
if(tot>k) break;
}
else if(y[i]>1)
{
ans+=f[i][k-tot]+f[i][k-1-tot];
ok=0;
break;
}
}
return ans;
}
int main()
{
init();
while(cin>>l>>r>>n>>b)
cout<<calc(r+1,n)-calc(l,n)<<endl;
return 0;
}