首页 > 其他 > 详细

数位dp D - Count The Bits

时间:2019-03-26 17:56:51      阅读:177      评论:0      收藏:0      [点我收藏+]

题目:D - Count The Bits

博客  

 

 

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <queue>
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int mod = 1000000009;
ll dp[130][1010][130]; //dp[i][j][k] 其中i代表第i位,j代表这个数的大小,因为我是要k的倍数,所以对k进行取膜即可,k就是表示这数化成二进制含有1的个数
int k, b;

ll dfs(int pos,int num,int sum,bool limit)
{
	if (pos == -1) return num ? 0 : sum;
	if (!limit&&dp[pos][num][sum] != -1) return dp[pos][num][sum];
	ll ans = 0;
	for(int i=0;i<=1;i++)
	{
		ans += dfs(pos - 1, (num * 2 + i) % k, sum + i, limit&&i);
		ans %= mod;
	}
	if (!limit) dp[pos][num][sum] = ans;
	return ans;
}

ll solve()
{
	return dfs(b - 1, 0, 0, true);
}

int main()
{
	scanf("%d%d", &k, &b);
	memset(dp, -1, sizeof(dp));
	printf("%I64d\n", solve());
	return 0;
}

  

 

数位dp D - Count The Bits

原文:https://www.cnblogs.com/EchoZQN/p/10601701.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!