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));
}
posted @ 2019-11-12 18:33  fbz  阅读(81)  评论(0编辑  收藏  举报