[bzoj1004] [HNOI2008]Cards
阿新 • • 發佈:2019-02-02
空格 clu fine 答案 sun 紅色 存在 描述 ace
接下來 m 行,每行描述一種洗牌法,每行有 n 個用空格隔開的整數 X1X2...Xn,恰為 1 到 n 的一個排列,表示使用這種洗牌法,第 i位變為原來的 Xi位的牌。輸入數據保證任意多次洗牌都可用這 m種洗牌法中的一種代
替,且對每種洗牌法,都存在一種洗牌法使得能回到原狀態。
註意到一個置換必定是其他若幹個置換之積,且
\[ ans=\frac{(a+b+c)!}{a!\cdot b!\cdot c!\cdot (m+1)} \]
數據沒有必要讀完,讀第一行就好了。
Description
小春現在很清閑,面對書桌上的N張牌,他決定給每張染色,目前小春只有3種顏色:紅色,藍色,綠色.他詢問Sun有多少種染色方案,Sun很快就給出了答案.進一步,小春要求染出Sr張紅色,Sb張藍色,Sg張絕色.他又詢問有多少種方,Sun想了一下,又給出了正確答案. 最後小春發明了M種不同的洗牌法,這裏他又問Sun有多少種不同的染色方案.兩種染色方法相同當且僅當其中一種可以通過任意的洗牌法(即可以使用多種洗牌法,而每種方法可以使用多次)洗成另一種.Sun發現這個問題有點難度,決定交給你,答案可能很大,只要求出答案除以P的余數(P為質數).
Input
第一行輸入 5 個整數:Sr,Sb,Sg,m,p(m<=60,m+1<p<100)。n=Sr+Sb+Sg。
替,且對每種洗牌法,都存在一種洗牌法使得能回到原狀態。
Output
不同染法除以P的余數
Sample Input
1 1 1 2 7
2 3 1
3 1 2
Sample Output
2
Solution
如果沒有洗牌這個約束,答案顯然就是:
\[
ans=\binom{a+b+c}{a}\cdot \binom{b+c}{b}=\frac{(a+b+c)!}{a!\cdot b!\cdot c!}
\]
註意到一個置換必定是其他若幹個置換之積,且
且對每種洗牌法,都存在一種洗牌法使得能回到原狀態
,即這些置換構成一個封閉群,所以除了單位元,必定沒有一個置換存在不動點,所以根據\(bornside\)引理可知,最終答案即:\[ ans=\frac{(a+b+c)!}{a!\cdot b!\cdot c!\cdot (m+1)} \]
數據沒有必要讀完,讀第一行就好了。
#include<bits/stdc++.h> using namespace std; void read(int &x) { x=0;int f=1;char ch=getchar(); for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-f; for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';x*=f; } #define write(x) printf("%d\n",x) const int maxn = 2e5+10; int mod; int qpow(int a,int x) { int res=1; for(;x;x>>=1,a=1ll*a*a%mod) if(x&1) res=1ll*res*a%mod; return res; } int fac(int n) { int res=1; for(int i=1;i<=n;i++) res=1ll*res*i%mod; return res; } int main() { int a,b,c,m;read(a),read(b),read(c),read(m),read(mod); write(1ll*fac(a+b+c)*qpow(1ll*fac(a)*fac(b)%mod*fac(c)%mod*(m+1)%mod,mod-2)%mod); return 0; }
[bzoj1004] [HNOI2008]Cards