比赛的时候没写出来,别人讲给我听的时候还是感觉比较简单。。比赛的时候压根想不到是个DP啊。。。DP要是能看出来时个DP那就成功了一半了。。。
#include <iostream>
#include <sstream>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <bitset>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <climits>
#define maxn 60
#define eps 1e-6
#define mod 200000007
#define INF 99999999
#define lowbit(x) (x&(-x))
#define lson o<<1, L, mid
#define rson o<<1 | 1, mid+1, R
typedef long long LL;
using namespace std;
LL dp[500][2000];
int main(void)
{
int _, i, j, n, m, k, __;
LL ans;
while(scanf("%d",&_)!=EOF){
__=0;
while(_--){
scanf("%d%d",&n,&m);
memset(dp, 0, sizeof dp);
dp[0][0]=1;
int tmp=1<<m;
for(i=0;i<n;i++)
for(j=0;j<tmp;j++)
if(dp[i][j])
for(k=0;k<m;k++)
dp[i+1][j | (1<<k)]=(dp[i+1][j | (1<<k)]+dp[i][j])%mod;
ans=0;
for(i=1;i<tmp-1;i++)
ans=(ans+dp[n][i])%mod;
printf("Case %d: %lld\n", ++__, ans);
}
}
return 0;
}