- 题意(原题):
- 一些卡片,染成三种不同的颜色,分别sr,sb,sg张。给出m种洗牌方法,求有多少染色方案。如果一种染色方案能通过某种洗牌方法变成另一种方案,这两种方案相同。保证任意多次洗牌都可用洗牌方法中的一种代替,且对每种洗牌法,都存在一种洗牌法使得能回到原状态。
- 思路:
- 这儿写的非常好,我认为我没必要再写一个。其中关于逆元的可以参考我的这篇文章。
- 代码:
using namespace std;
LL ans=1,sr,sb,sg,n,m,p;
LL power(LL a,LL b)
{
LL ans=1;
while(b)
{
if(b&1)ans=ans*a%p;
a=a*a%p;b/=2;
}
return ans;
}
int main()
{
scanf("%lld %lld %lld %lld %lld",&sr,&sb,&sg,&m,&p);n=sr+sb+sg;
LL t=1;for(LL i=1;i<=sr;i++)t=t*(n-i+1)/i;ans=ans*(t%p)%p;
t=1;n-=sr;for(LL i=1;i<=sg;i++)t=t*(n-i+1)/i;ans=ans*(t%p)%p;
ans=(ans*power(m+1,p-2))%p;printf("%lld\n",ans);
return 0;
}