链接
http://www.lydsy.com/JudgeOnline/problem.php?id=4321
题解
f[i][j][0/1]
表示前i个人排了队,有j对不合法的,
i
跟
转移见程序。
代码
//动态规划
#include <cstdio>
#include <algorithm>
#define maxn 1100
#define mod 7777777
#define ll long long
using namespace std;
ll F[maxn][maxn][3], N;
inline void u(ll x, ll &y){y=(y+x)%mod;}
int main()
{
ll i, (*f)[3], (*g)[3], j;
scanf("%lld",&N);
F[1][0][0]=1;
for(i=1;i<N;i++)for(j=0;j<i;j++)
{
f=F[i], g=F[i+1];
u(f[j][0]*j,g[j-1][0]);
u(f[j][0]*2,g[j+1][1]);
u(f[j][0]*(i-j-1),g[j][0]);
u(f[j][1]*(j-1),g[j-1][0]);
u(f[j][1]*(i-j),g[j][0]);
u(f[j][1],g[j][1]);
u(f[j][1],g[j+1][1]);
}
printf("%lld",F[N][0][0]);
return 0;
}