套路DP…这种和相邻数有关的一般考虑从小到大插入。
fi,j,0/1
表示放了前
i
个数,有
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=1005,MOD=7777777;
typedef long long LL;
LL f[maxn][maxn][2];
int n;
int main(){
//freopen("bzoj4321.in","r",stdin);
//freopen("bzoj4321.out","w",stdout);
scanf("%d",&n);
f[1][0][0]=1;
for(int i=1;i<=n-1;i++)
for(int j=0;j<=i-1;j++)
for(int k=0;k<=1;k++) if(f[i][j][k]){
if(k>0) (f[i+1][j][1]+=f[i][j][k])%=MOD;
(f[i+1][j+1][1]+=f[i][j][k]*(2-k)%MOD)%=MOD;
if(j-k>0) (f[i+1][j-1][0]+=f[i][j][k]*(j-k)%MOD)%=MOD;
if(i+1-(j-k)-2>0) (f[i+1][j][0]+=f[i][j][k]*(i+1-(j-k)-2)%MOD)%=MOD;
}
printf("%lld\n",f[n][0][0]);
return 0;
}