某中學有 n 名男同學,m 名女同學和兩名老師要排隊參加體檢。他們排成一條直線,並且任意兩名女同學不能相鄰,兩名老師也不能相鄰,那麼一共有多少種排法呢?(注意:任意兩個人都是不同的)
輸入格式:
只有一行且為用空格隔開的兩個非負整數 n 和 m,其含義如上所述。 對於 30%的資料 n<=100,m<=100 對於 100%的資料 n<=2000,m<=2000
輸出格式:
輸出檔案 output.txt 僅包含乙個非負整數,表示不同的排法個數。注意答案可能很大。
輸入樣例#1:
1 1
輸出樣例#1:
12題解:高精+排列組合
n個男生排列a(n,n),然後插上兩個老師a(n+1,2),然後插上m個女生
a(n+2,m-1),結果就是a(n,n)*a(n+1,2)*a(n+2,m-1)。
但是發現,兩個老師插入時是可以挨在一起的,只要乙個女生去他們中間就好了。
把兩個老師看成乙個男生,是a(n+1,n+1)*a(2,2),中間再插入乙個女生
a(n+1,n+1)*a(2,2)*m,然後剩下的m-1個女生再插入,結果是
a(n+1,n+1)*a(2,2)*m*a(n+2,m-1)。
那麼總的答案就是
a(n,n)*a(n+1,2)*a(n+3,m)+a(n+1,n+1)*a(2,2)*m+a(n+2,m-1)
化簡一下式子最後只要高精乘就可以了。
這是個壓位高精吧...背的candy?模板我也不知道啊...(逃...
一直wa原來是陣列開小了...
**:
#include#include#include
#define ll long long
#define b 10000
using
namespace
std;
ll m,n;
struct
big big():n(
1)
void ini(int x)
}ans,p;
big
operator *(big a, int
b) big
operator *(big a, big b)
c.n = a.n +b.n;
while(c.n>1 && c[c.n]==0) c.n--;
returnc;}
big
operator +(big a, big b)
a.n =n;
if(g) a[++a.n] =g;
returna;}
big
operator -(big a, big b)
int p=b.n+1
;
while(a[p]<0) a[p]+=b, a[++p]--;
while(a.n>1 && a[a.n]==0) a.n--;
returna;}
void print(big &a)
intmain()
洛谷P3225 HNOI2012 礦場搭建
題意 煤礦工地可以看成是由隧道連線挖煤點組成的無向圖。為安全起見,希望在工地發生事故時所有挖煤點的工人都能有一條出路逃到救援出口處。於是礦主決定在某些挖煤點設立救援出口,使得無論哪乙個挖煤點坍塌之後,其他挖煤點的工人都有一條道路通向救援出口。請寫乙個程式,用來計算至少需要設定幾個救援出口,以及不同最...
洛谷 P3225 HNOI2012 礦場搭建
邊數n 500的挖煤點,需要設定盡量少的逃生出口,使得某個煤礦倒塌後,其他挖煤點的工人仍然可以通過某條路徑到達逃生出口,並給出逃生出口最少設定數量與方案數 多組資料 倒塌一座後 這一點令人想到割點 割點的倒塌會增加連通塊數量,產生隔斷 所以本題中顯然割點是比較重要的一種分析。先用tarjan跑出割點...
洛谷 P3225 HNOI2012 礦場搭建
煤礦工地可以看成是由隧道連線挖煤點組成的無向圖。為安全起見,希望在工地發生事故時所有挖煤點的工人都能有一條出路逃到救援出口處。於是礦主決定在某些挖煤點設立救援出口,使得無論哪乙個挖煤點坍塌之後,其他挖煤點的工人都有一條道路通向救援出口。請寫乙個程式,用來計算至少需要設定幾個救援出口,以及不同最少救援...