https://loj.ac/problem/10163
题目描述
求一段区间([x,y])内满足恰好等于(K)个不相等的(B)的整次幂的和的数的个数。
思路
题目求的其实就是在区间([x,y])内满足在(B)进制下有且仅有(K)个(1),其余位位(0)的数的个数。我们显然可以先转化为区间减法,接下来考虑如何求([1,x])内符合条件的数的个数。我们可以按位思考,如果这一位大于(1),显然对于这之后的位数可以任意选,我们直接统计剩余的位数中选出(k)个(1)的方案数即可,如果这一位等于(1),我们可以考虑先加上这一位为(0)时的方案数,再令这一位为(1)统计答案即可。
代码
#include<bits/stdc++.h>
using namespace std;
int f[40][40];
void pre()
{
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 p[50],b;
int cal(int x,int k)
{
int cnt=0;
while(x)p[++cnt]=x%b,x/=b;
int ans=0;
for(int i=cnt;i>=1;i--)
{
if(p[i]>1){ans+=f[i][k];break ;}
else if(p[i]==1)ans+=f[i-1][k],k--;
if(k<0)break ;
}
return ans;
}
int main()
{
int x,y,k;
pre();
scanf("%d%d%d%d",&x,&y,&k,&b);
printf("%d",cal(y+1,k)-cal(x,k));
}