n 个沙茶,被编号 1~n。排完队之后,每个沙茶希望,自己的相邻的两
人只要无一个人的编号和自己的编号相差为 1(+1 或-1)就行;
现在想知道,存在多少方案满足沙茶们如此不苛刻的条件。
#include<cstdio> #include<cctype> #include<queue> #include<cmath> #include<cstring> #include<algorithm> #define rep(i,s,t) for(int i=s;i<=t;i++) #define dwn(i,s,t) for(int i=s;i>=t;i--) #define ren for(int i=first[x];i!=-1;i=next[i]) using namespace std; inline int read() { int x=0,f=1;char c=getchar(); for(;!isdigit(c);c=getchar()) if(c==‘-‘) f=-1; for(;isdigit(c);c=getchar()) x=x*10+c-‘0‘; return x*f; } typedef long long ll; const int mod=7777777; const int maxn=1010; ll f[maxn][maxn][2]; int main() { int n=read(); f[1][0][0]=1; rep(i,1,n) rep(j,0,i-1) { (f[i+1][j+1][1]+=2*f[i][j][0])%=mod; (f[i+1][j-1][0]+=j*f[i][j][0])%=mod; (f[i+1][j][0]+=(i-j-1)*f[i][j][0])%=mod; (f[i+1][j+1][1]+=f[i][j][1])%=mod; (f[i+1][j][1]+=f[i][j][1])%=mod; (f[i+1][j-1][0]+=(j-1)*f[i][j][1])%=mod; (f[i+1][j][0]+=(i-j)*f[i][j][1])%=mod; } printf("%lld\n",f[n][0][0]%mod); return 0; }
原文:http://www.cnblogs.com/wzj-is-a-juruo/p/4978198.html