求 0 …… 2^i -1 中所有 % k == 0 的数,二进制中 1
的个数。
#include<bits/stdc++.h>
using namespace std;
int mod = 1e9+9;
long long f[200][2000],g[200][2000];
//f 前 i 位, % k 余 j 有多少个数。
//g 前 i 位, % k 余 j 的二进制有多少个 1 ;
int main(){
int b,k;
long long a;
scanf("%d%d",&k,&b);
a = 1;
f[0][0] = 1;
for (int i = 1; i <= b; ++i){
for (int j = 0; j < k; ++j){
f[i][j] += f[i-1][j];
g[i][j] += g[i-1][j];
f[i][(j+a)%k] += f[i-1][j];
g[i][(j+a)%k] += g[i-1][j] + f[i-1][j];
}
for (int j = 0; j < k; ++j)
f[i][j] %= mod, g[i][j] %= mod;
a = (a * 2) % k;
}
printf("%lld\n",g[b][0]);
return 0;
}