• 2729: [HNOI2012]排队


    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.  
  • 相关阅读:
    [HNOI/AHOI2018]转盘
    [PKUSC2018]星际穿越
    [PKUSC2018]最大前缀和
    [PKUSC2018]真实排名
    PKUSC2018游记
    [CF843D]Dynamic Shortest Path
    [BZOJ5358]/[HDU6287]口算训练
    [CF160D]Edges in MST
    AGC041D Problem Scores
    BZOJ4079 [WF2014]Pachinko
  • 原文地址:https://www.cnblogs.com/HansBug/p/4282021.html
Copyright © 2020-2023  润新知