题目描述 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.