标签:分享 cto etc 中间 pen names long getchar efi

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include<iostream>
#include<cstdio>
#include<iomanip>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#define ll long long
#define db double
#define inf 0x7fffffff
#define rg register int
#define mod 1000000007
using namespace std;
int n,m,s=1;
ll now,f[2][51][2501][3];
inline int qr(){
    char ch;
    while((ch=getchar())<'0'||ch>'9');
    int res=ch^48;
    while((ch=getchar())>='0'&&ch<='9')
        res=res*10+(ch^48);
    return res;
}
int main(){
    freopen("wave.in","r",stdin);
    freopen("wave.out","w",stdout);
    n=qr();m=qr();
    f[0][0][1198][2]=1;
    f[0][0][1199][1]=2;//初始化
    for(rg i=2;i<=n;++i,s^=1){
        memset(f[s],0,sizeof(f[s]));
        for(rg j=0;j<=49;++j)
            for(rg t=100;t<=2401;++t)
                for(rg k=0;k<=2;++k){
                    if(!(now=f[s^1][j][t][k]))continue;    //开始转移f[i][j][t][k]
                    f[i][j+1][t-i*2][k]+=f[i][j][t][k]*(j+k); //建一个新的块
                    
                    f[i][j][t][k]+=f[i][j][t][k]*(j*2+k);     //贴在一块旁边
                    
                    f[i][j-1][t+i*2][k]+=f[i][j][t][k]*j;//夹在两块中间
                    
                    f[i][j][t+i][k-1]+=now*k;     //放在端点且与一块相连
                    
                    f[i][j+1][t-i][k-1]+=now*k;   //放在端点且不与任何一个块相邻
                    
                }
    }printf("%lld\n",f[s^1][0][m+1200][0]%mod);
    return 0;
标签:分享 cto etc 中间 pen names long getchar efi
原文地址:https://www.cnblogs.com/812-xiao-wen/p/10331514.html