给出n、k(n≤64,k≤100),有多少个n位(无前导0)二进制数的1和0一样多,且值为k的倍数?
+=f[i][j][k]
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std ;
#define ll long long
int n,m;
ll f[102][102][102];
void sov(int cas){
cin>>n>>m;
if(m==0||(n&1)){
printf("Case %d: %lld\n",cas,0);
return ;
}
int i,j,k;
memset(f,0,sizeof f);
f[1][1%m][1]= 1;
for(i=1;i<n;i++)
for(k=0;k<=i;k++)
for(j=0;j<m;j++){
f[i+1][(j<<1)%m][k]+= f[i][j][k];
f[i+1][(j<<1|1)%m][k+1]+= f[i][j][k];
}
printf("Case %d: %lld\n",cas,f[n][0][n/2]);
}
signed main(){
int tes,cas=0;cin>>tes;
while(tes--)
sov(++cas) ;
}
浙公网安备 33010602011771号