题解

xy0313 2020-09-30 9:10:00 2020-09-30 9:12:39

把给的十进制数转化为B进制数,各个数位上除了0就是1才符合条件

f[i][j]为前i位j个1的数量

初始化就是个组合数,自己想吧

这个数位DP模板题挺好想的

#include <iostream>

using namespace std;

const int N = 35;

int f[N][N];

int k,B;

void init()
{
	for(int i = 0;i <= N;i ++)
		for(int j = 0;j <= i;j ++)
			if(!j) f[i][j] = 1;
			else if(i && j) f[i][j] = f[i - 1][j] + f[i - 1][j - 1];
}

int dp(int x)
{
	if(!x) return 0;
	int a[N] = {0};
	int l = 0;
	int last = 0;
	int ans = 0;
	while(x)
	{
		a[++ l] = x % B;
		x /= B;
	}
	for(int i = l;i >= 1;i --)
	{
		if(a[i])
		{
			ans += f[i - 1][k - last];
			if(a[i] > 1)
			{
				if(k - last - 1 >= 0) ans += f[i - 1][k - last - 1];
				break;
			}
			else{
				last ++;
				if(last > k) break;
			}
		}
		if(i == 1 && k == last) ans ++;
	}
	return ans;
}

int main()
{
	init();
	int l,r;
	cin >> l >> r >> k >> B;
	cout << dp(r) - dp(l - 1);
	return 0;
}