南邮 OJ 1912 E.V.O.L

E.V.O.L

时间限制(普通/Java) :  1000 MS/ 3000 MS          运行内存限制 : 65536 KByte
总提交 : 29            测试通过 : 2 

比赛描述

acm协会招了一批新人,E.V.O.L在面试的时候发现这批新人刚高是n对情侣。现在这2n个人站成了一排,变态的E.V.O.L当然要把每一对情侣都拆散,现在他有多少种不同的方式安排这2n个人使得每一对情侣之间都至少有一个其他人(结果请对10007取模)?



输入

每行一个正整数n(0<n<100)

输出

一个正整数表示计算结果

样例输入

1

样例输出

0

题目来源

ACM爱好者协会





/* WA1
#include<iostream>
using namespace std;

#define MAX_N 201
#define MOD 10007
int a[MAX_N];

int main(){
	int i,n;
	a[0] = a[1] = 0;
	a[2] = 8;
	for(i=3;i<MAX_N;i++){
		a[i] = a[i-1]*(2*i-1)%MOD*(2*i-2)%MOD;
	}
	while(scanf("%d",&n)==1){
		printf("%d\n",a[n]);
	}
}
*/



/* openxxx 的代码 AC
#include<cstdio>
#include<iostream>
using namespace std;

int N;
int Mod=10007;
int F[205][205],H[105],B[105];

void openxxx()
{
    F[1][1]=H[0]=B[0]=1;
    for(int i=1;i<=100;i++)
    {
        H[i]=(H[i-1]*i)%Mod;
        B[i]=(B[i-1]*2)%Mod;
    }
    for(int i=4;i<=200;i+=2)
    {
        for(int j=1;j<=(i-2);j++)
        {
            F[0][i]=(F[0][i]+F[j][i-2-j])%Mod;
            F[i][0]=(F[i][0]+F[j][i-2-j])%Mod;
        }
        for(int j=1;j<i;j++)
        {
            F[j][i-j]=(F[0][i]+F[j-1][i-j-1])%Mod;
        }
    }
}

int main()
{
    openxxx();
    while(cin>>N)
    {
        cout<<(((H[N]*B[N])%Mod)*F[0][2*N])%Mod<<endl;
    }
    return 0;
}
*/

#include<cstdio>
#include<iostream>
using namespace std;

int N;
int Mod=10007;
int F[205][205],H[105],B[105];

void openxxx()
{
    F[1][1]=H[0]=B[0]=1;
    for(int i=1;i<=100;i++)
    {
        H[i]=(H[i-1]*i)%Mod;
        B[i]=(B[i-1]*2)%Mod;
    }
    for(int i=4;i<=200;i+=2)
    {
        for(int j=1;j<=(i-2);j++)
        {
            F[0][i]=(F[0][i]+F[j][i-2-j])%Mod;
            F[i][0]=(F[i][0]+F[j][i-2-j])%Mod;
        }
        for(int j=1;j<i;j++)
        {
            F[j][i-j]=(F[0][i]+F[j-1][i-j-1])%Mod;
        }
    }
}

int main()
{
    openxxx();
    while(cin>>N)
    {
        cout<<(((H[N]*B[N])%Mod)*F[0][2*N])%Mod<<endl;
    }
    return 0;
}


你可能感兴趣的:(ACM,南邮OJ,E.V.O.L)