P1446 [HNOI2008]Cards

传送门

还是有点没搞懂置换群这玩意儿……
根据题目的保证我们可以知道所有的洗牌构成了一个置换群,这个置换群的大小为(m+1)(包括原置换)
然后总的状态数为(C(a+b+c,a)*C(b+c,c)*C(c,c)),即(frac{(a+b+c)!}{a!b!c!})
然后感性理解一下发现对于只有原置换有不动点……
然后根据burnside引理答案就是(frac{(a+b+c)!}{a!b!c!(m+1)})

//minamoto
#include<bits/stdc++.h>
#define fp(i,a,b) for(register int i=a,I=b+1;i<I;++i)
#define fd(i,a,b) for(register int i=a,I=b-1;i>I;--i)
using namespace std;
const int N=105;
int a,b,c,m,p,fac[N],inv;
int ksm(int a,int b){
	int res=1;
	for(;b;b>>=1,a=1ll*a*a%p)if(b&1)res=1ll*res*a%p;
	return res;
}
int main(){
//	freopen("testdata.in","r",stdin);
	scanf("%d%d%d%d%d",&a,&b,&c,&m,&p);
	fac[0]=1;fp(i,1,N-2)fac[i]=1ll*fac[i-1]*i%p;
	inv=ksm(1ll*fac[a]*fac[b]%p*fac[c]%p*(m+1)%p,p-2);
	printf("%d
",1ll*fac[a+b+c]*inv%p);
}
原文地址:https://www.cnblogs.com/bztMinamoto/p/10053774.html