题意:
给定k和b,问[0,2b-1]中,k的倍数的二进制1的总个数是多少。
答案对1e9+9取模。
数据范围:k<=1000,b<=128
解法:
令d[x][y][z]=p表示:
1.当前未枚举长度为x,
2.当前数模k=y
3.当前已经使用的1的个数为z
4.该状态向下枚举,1的总个数为p.
数位dp一下即可.
ps:
应该也可以在[0,b]内枚举1的个数i,对每种个数都数位dp一次,
计算i个1组成模k=0的数的方案数tot,那么ans+=i*tot.
code:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxm=1e3+5;
const int mod=1e9+9;
int d[130][1005][130];
int p[130];
int k,b;
int dfs(int len,int md,int tot){
if(!len)return md?0:tot;
if(d[len][md][tot]!=-1)return d[len][md][tot];
int ans=0;
for(int i=0;i<=1;i++){
ans=(ans+dfs(len-1,(md+i*p[len-1])%k,tot+i))%mod;
}
return d[len][md][tot]=ans;
}
int solve(){
return dfs(b,0,0);
}
signed main(){
scanf("%d%d",&k,&b);
p[0]=1%k;
for(int i=1;i<130;i++)p[i]=p[i-1]*2%k;
memset(d,-1,sizeof d);
int ans=solve();
printf("%d\n",ans);
return 0;
}