一看就知道是数学题,考虑插空法
由于老师只有两人,所以先对老师进行插空
这里考虑两种情况:
1.两个老师站在同一处,即两个男生之间站了两个老师
这时候需要一个女生站在两个老师之间,再对女生插空,根据乘法原理即2*(n+1)*m*P(m-1,n+2);
2.两个老师已经被男生隔开了
这时候即P(2,n+1)*P(m,n+3);
最后加起来还要乘以n!(即男生排列数)即可

 1 var a,b:array[0..30010] of longint;
 2     i,la,lb,n,m:longint;
 3 
 4 procedure mul(y:longint);
 5   var i,j,x,t:longint;
 6   begin
 7     t:=0;
 8     for i:=1 to la do
 9     begin
10       x:=a[i]*y+t;
11       a[i]:=x mod 10;
12       t:=x div 10;
13     end;
14     while t>0 do
15     begin
16       inc(la);
17       a[la]:=t mod 10;
18       t:=t div 10;
19     end;
20   end;
21 
22 procedure add;
23   var i,x,t:longint;
24   begin
25     if lb>la then la:=lb;
26     t:=0;
27     for i:=1 to la do
28     begin
29       x:=a[i]+b[i]+t;
30       a[i]:=x mod 10;
31       t:=x div 10;
32     end;
33     while t<>0 do
34     begin
35       inc(la);
36       a[la]:=t mod 10;
37       t:=t div 10;
38     end;
39   end;
40 
41 begin
42   readln(n,m);
43   la:=1;
44   a[1]:=1;
45   for i:=1 to m do
46     mul(n+4-i);
47   mul(n+1);
48   mul(n);
49   lb:=la;
50   b:=a;
51   la:=1;
52   fillchar(a,sizeof(a),0);
53   a[1]:=2;
54   mul(n+1);
55   mul(m);
56   for i:=1 to m-1 do
57     mul(n+3-i);
58   add;
59   for i:=2 to n do
60     mul(i);
61 
62   for i:=la downto 1 do
63     write(a[i]);
64   writeln;
65 end.
66   
View Code

 

posted on 2014-12-31 22:54  acphile  阅读(247)  评论(0编辑  收藏  举报