组合数学+高精度 BZOJ2729 [HNOI2012]排队

2729: [HNOI2012]排队

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 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

day1

 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 
原文地址:https://www.cnblogs.com/zwube/p/7134562.html