//Accepted 368K 532MS //线性dp //dp[i][j]表示前i位最后一个是j的排列数 //dp[i][j]=sum(dp[i-1][h]) h*2<=j #include <cstdio> #include <cstring> #include <iostream> using namespace std; ; ; __int64 dp[imax_n][imax_m]; int n,m; void Dp() { memset(dp,,sizeof(dp)); ;i<=m;i++) dp[][i]=; ;i<=n;i++) { <<(i-);j<=m;j++) { dp[i][j]=; <<(i-);*k<=j;k++) { dp[i][j]+=dp[i-][k]; } } } } int main() { int T; scanf("%d",&T); ;t<=T;t++) { scanf("%d%d",&n,&m); Dp(); __int64 ans=; <<(n-);i<=m;i++) ans+=dp[n][i]; printf("Case %d: n = %d, m = %d, # lists = %I64d\n",t,n,m,ans); } ; }