题意:复习功课,有n章,每天复习1章,但第i章不能再第i天和第(i+1)%n 天复习,问有多少种复习方式? mod 10^9+7
对于含k个禁排的,这里如果将X按照图上顺序标号,那么问题就转化成在1-2n的圆排列中去k个不相邻的方法数。
#include<iostream>
#include<cstdio>
#include<string.h>
#include<math.h>
#define mod 1000000007
#define N 200005
typedef long long LL;
LL f[N];
void inint()
{
f[0]=1;
for(int i=1;i<N;i++)
f[i]=(i*f[i-1])%mod;
}
LL pow(LL a,LL n)
{
LL r=1,p=a;
while(n)
{
if(n&1) r=(r*p)%mod;
p=(p*p)%mod;
n>>=1;
}
return r;
}
int main()
{
int i,j,n,t;
inint();
LL res,up,down,ans;
while(~scanf("%d",&n))
{
if(n<3)
{
printf("0\n");
continue;
}
res=f[n];
t=2*n;
for(i=1;i<=n;i++)
{
up=(t*f[t-i-1])%mod;
down=(f[i]*f[t-2*i])%mod;
down=pow(down,mod-2);
ans=(up*down)%mod;
ans=(ans*f[n-i])%mod;
if(i&1)
res=((res-ans)%mod+mod)%mod;
else
res=(res+ans)%mod;
}
printf("%lld\n",res);
}
return 0;
}