2729: [HNOI2012]排队

时间:2022-05-07
本文章向大家介绍2729: [HNOI2012]排队,主要内容包括2729: [HNOI2012]排队、Description、Input、Output、Sample Input、Sample Output、HINT、Source、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。

2729: [HNOI2012]排队

Time Limit: 10 Sec  Memory Limit: 128 MB

Submit: 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

day1

题解:做完此题发现我还是摆脱不了逗比的本性——好好的高精度,结果输出时弄反了。。。呵呵呵。。。典型的对自己自信过头的后果 说思路吧:经典的插空思想,男生爱咋搞砸搞,于是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.