2729: [HNOI2012]排队
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 957 Solved: 449
[Submit][Status]
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
题解:做完此题发现我还是摆脱不了逗比的本性——好好的高精度,结果输出时弄反了。。。呵呵呵。。。典型的对自己自信过头的后果
说思路吧:经典的插空思想,男生爱咋搞砸搞,于是N!,然后接下来轮到妹纸和Teacher,老师不在一起时,则很明显情况为m*C(n+1,1)*C(n+2,m-1)也就是m*(n+1)*C(n+2,m-1),在一起时就是C(n+3,m)*C(n+1,2),然后直接求和没了,高精度啥的是显然的。。。只求别在逗比TT
1 /************************************************************** 2 Problem: 2729 3 User: HansBug 4 Language: Pascal 5 Result: Accepted 6 Time:1920 ms 7 Memory:1008 kb 8 ****************************************************************/ 9 10 type 11 arr=array [0..100001] of longint; 12 var 13 i,j,k,l,m,n,a1,a2,a3,a4:longint; 14 a,b:arr; 15 procedure multy (var a:arr; b:longint);inline; 16 var 17 i:longint; 18 begin 19 for i:=1 to a[0] do a[i]:=a[i]*b; 20 i:=1; 21 while (i<=a[0])or(a[i]>0) do 22 begin 23 a[i+1]:=a[i+1]+a[i] div 10; 24 a[i]:=a[i] mod 10; 25 inc(i); 26 end; 27 dec(i); 28 a[0]:=i; 29 end; 30 31 procedure addty (var a,b:arr);inline; 32 var 33 i,k:longint; 34 begin 35 if a[0]>b[0] then k:=a[0] else k:=b[0]; 36 for i:=1 to k do 37 begin 38 a[i]:=a[i]+b[i]; 39 a[i+1]:=a[i+1]+a[i] div 10; 40 a[i]:=a[i] mod 10; 41 end; 42 if a[k+1]<>0 then inc(k); 43 a[0]:=k; 44 end; 45 46 begin 47 readln(n,m); 48 if (n=0)and(m=0) then begin writeln(0);halt; end; 49 fillchar(b,sizeof(b),0); 50 b[1]:=1; b[0]:=1; 51 multy(b,n+1); 52 multy(b,2); 53 multy(b,m); 54 for i:=n+2-m+2 to n+2 do multy(b,i); 55 a:=b; 56 fillchar(b,sizeof(b),0); 57 b[0]:=1; b[1]:=1; 58 multy(b,n+1); 59 multy(b,n); 60 for i:=n+4-m to n+3 do multy(b,i); 61 addty(a,b); 62 for i:=2 to n do multy(a,i); 63 for i:=a[0] downto 1 do write(a[i]); 64 writeln; 65 end.