#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=a;i<b;i++)
#define per(i,a,b) for(int i=b-1;i>=a;i--)
typedef long long ll;
int N,K;
ll dp[65][2][65][110];
int bit[65];
/*
又是一道数位dp,还是很懵逼
1.核心:状态压缩--->难点:怎样压缩表示
2.思想:树形的dp
*/
ll dfs(int pos,int v,int limit,int num1,ll sum){
if(pos==-1){
if((num1==N/2)&&(sum==0)){
return 1;
}
return 0;
}
if(!limit&&dp[pos][v][num1][sum]!=-1){
return dp[pos][v][num1][sum];
}
ll ans=0;
int max_num=limit?bit[pos]:1;
rep(i,0,max_num+1){
if(!i)
ans+=dfs(pos-1,0,limit&&i==max_num,num1,(sum*2)%K);
else
ans+=dfs(pos-1,1,limit&&i==max_num,num1+1,(sum*2+1)%K);
}
if(!limit)dp[pos][v][num1][sum]=ans;
return ans;
}
ll solve(int n){
memset(dp,-1,sizeof(dp));
rep(i,0,n)bit[i]=1;
return dfs(n-2,1,1,1,1ll);
}
int main(){
int T;
scanf("%d",&T);
rep(kase,1,T+1){
scanf("%d %d",&N,&K);
if(N&1||!K){
printf("Case %d: 0\n",kase);
continue;
}
printf("Case %d: %lld\n",kase,solve(N));
}
return 0;
}
Zeros and Ones UVA - 12063
猜你喜欢
转载自blog.csdn.net/qq_36424540/article/details/81347356
今日推荐
周排行