Count The Bits
题意:求[0,2^b-1]里面k的倍数的二进制数里1的个数。
思路:dp[i][j]表示前i位数里模k为j的数目,cnt[i][j]表示第i位数模k为j的数目。当当前位为0时,dp[i][j]+=dp[i-1][j],cnt[i][j]+=dp[i-1][j]。为1时temp=(1<<i+j)%k,cnt[i][temp]=cnt[i][temp]+cnt[i-1][j]; dp[i][tmp2] = ((dp[i][tmp2] + cnt[i-1][j]) % MOD + dp[i-1][j]);
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=1e9+9;
ll dp[1005][1005],cnt[1005][1005];
int main(){
int k,b;
scanf("%d%d",&k,&b);
cnt[1][0]++;
dp[1][1%k]++;
cnt[1][1%k]++;
ll temp=1;
for(int i=1;i<=b;i++){
temp=(temp<<1)%k;
for(int j=0;j<k;j++){
dp[i+1][j]=(dp[i+1][j]+dp[i][j])%mod;
cnt[i+1][j]=(cnt[i+1][j]+cnt[i][j])%mod;
ll temp1=(temp+j)%k;
cnt[i+1][temp1]=(cnt[i+1][temp1]+cnt[i][j])%mod;
dp[i+1][temp1]=(dp[i][j]+(cnt[i][j]+dp[i+1][temp1])%mod)%mod;
}
}
printf("%lld\n",dp[b][0]);
}