ural 1057 Amount of Degrees
求给定区间[X,Y]中满足下列条件的整数个数:这个数恰好等于K 个互不相等的B的整数次幂之和。
分析:
所求的数为互不相等的幂之和,即起B进制表示的各位数字都只能是0和1,所以我们只考虑二进制的情况,且其他进制也可以转化为二进制。
本题满足区间减法,即 count【i...j】=count【j】-count【i-1】。对于n,我们只需求0-n有多少个满足条件的。
代码如下:
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
int f[35][35]; //前 i 位有 j 个 1 的个数...
int x, y, b;
int pos[35];
int len;
void init()
{ //预处理
memset(f,0,sizeof(f));
f[0][0] = 1;
for(int i=1; i<=32; i++)
{
f[i][0] = f[i-1][0];
for(int j=1; j<=i; j++)
{
f[i][j] = f[i-1][j-1] + f[i-1][j];
}
}
}
int solve(int t, int k)
{
len = 1;
while(t)
{
pos[len++] = t % b;
t /= b;
}
int ans = 0;
for(int i=len-1; i>=1; i--)
{
if(pos[i] > 1)
{
ans += f[i-1][k] + f[i-1][k-1];
break;
}
else if(pos[i] == 1)
{
ans += f[i-1][k];
k --;
}
if(k < 0)
break;
}
return ans;
}
int main()
{
init();
int k;
while(~scanf("%d%d%d%d", &x, &y, &k, &b))
{
int ans1 = solve(y+1, k);
int ans2 = solve(x, k);
printf("%d\n", ans1-ans2);
}
return 0;
}