2729: [HNOI2012]排队
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1787 Solved: 845
[Submit][Status][Discuss]
Description
某中学有 n 名男同学,m 名女同学和两名老师要排队参加体检。他们排成一条直线,并且任意两名女同学不能相邻,两名老师也不能相邻,那么一共有多少种排法呢?(注意:任意两个人都是不同的)
Input
只有一行且为用空格隔开的两个非负整数 n 和 m,其含义如上所述。
对于 30%的数据 n≤100,m≤100
对于 100%的数据 n≤2000,m≤2000
Output
输出文件 output.txt 仅包含一个非负整数,表示不同的排法个数。注意答案可能很大。
Sample Input
1 1
Sample Output
12
HINT
Source
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 int n,m; 7 const int mod=100000000; 8 struct data{ 9 long long num[100010]; 10 int len; 11 void print(){ 12 printf("%lld",num[len]); 13 for(int i=len-1;i>=1;i--) printf("%08lld",num[i]); 14 } 15 }a; 16 void cheng(int x){ 17 for(int i=1;i<=a.len;i++) a.num[i]*=x; 18 for(int i=1;i<=a.len;i++) a.num[i+1]+=a.num[i]/mod,a.num[i]%=mod; 19 while(a.num[a.len+1]) a.len++,a.num[a.len+1]+=a.num[a.len]/mod,a.num[a.len]%=mod; 20 } 21 int main(){ 22 scanf("%d%d",&n,&m); 23 a.len=1; 24 a.num[1]=1; 25 for(int i=2;i<=n;i++) cheng(i); 26 cheng(n+1); 27 cheng((n+3)*n+2*m); 28 for(int i=n+4-m;i<=n+2;i++) cheng(i); 29 a.print(); 30 return 0; 31 } 32