Amount of Degrees
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));
}