2729:[HNOI2012]排队 - BZOJ

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

 

你可能感兴趣的:(2012)