2729:[HNOI2012]排队

题目描述 Description
某中学有n 名男同学,m 名女同学和两名老师要排队参加体检。他们排成一条直线,并且任意两名女同学不能相邻,两名老师也不能相邻,那么一共有多少种排法呢?(注意:任意两个人都是不同的)
输入描述 Input Description
输入文件只有一行且为用空格隔开的两个非负整数n 和m,其含义如上所述。
输出描述 Output Description
仅包含一个非负整数,表示不同的排法个数。注意答案可能很大。
样例输入 Sample Input
样例输入1
1 1

样例输入2
7 3
样例输出 Sample Output
样例输出1
12

样例输出2
220631040
数据范围及提示 Data Size & Hint
对于30%的数据n≤100,m≤100
对于100%的数据n≤2000,m≤2000


先把老师和男同学放在一起,把女生插进来
再减去两个老师在一起的情况,经过化简
ANS=(n+1)!A(n+2,m-1)*(n^2+3*n+2*m)
然后就是高精度了

 1 const
 2     h=1000000;
 3 var
 4     a:array[0..10000]of int64;
 5     n,m:longint;
 6 
 7 procedure cheng(x:int64);
 8 var
 9     i:longint;
10 begin
11     for i:=1 to a[0] do
12       a[i]:=a[i]*x;
13     for i:=1 to a[0] do
14       begin
15         inc(a[i+1],a[i]div h);
16         a[i]:=a[i]mod h;
17       end;
18     i:=a[0]+1;
19     while a[i]>0 do
20       begin
21         inc(a[0]);
22         inc(a[i+1],a[i] div h);
23         a[i]:=a[i]mod h;
24         inc(i);
25       end;
26 end;
27 
28 procedure main;
29 var
30     i,k:longint;
31 begin
32     read(n,m);
33     a[0]:=1;
34     a[1]:=n*n+3*n+2*m;
35     for i:=2 to n+1 do
36       cheng(i);
37     for i:=1 to m-1 do
38       cheng(n+3-i);
39     write(a[a[0]]);
40     for i:=a[0]-1 downto 1 do
41       begin
42         k:=h div 10;
43         while k>1 do
44           begin
45             if a[i]<k then write(0);
46             k:=k div 10;
47           end;
48         write(a[i]);
49       end;
50 end;
51 
52 begin
53     main;
54 end.
View Code
原文地址:https://www.cnblogs.com/Randolph87/p/3582392.html