网上好多blog用置换的思想做的这道题
其实这道题m种方法具体是什么已经无所谓了
题目中有一句话:保证可以通过某种洗牌方式转换回最原始的牌样。这句话十分重要
相当于,每个种类有m种变式(总计m+1)
所以总种类除以m+1就好。记得用逆元哦
#include <cstdio>
int sr, sb, sg, m, p, ans = 1;
int quick_pow(int a,int b){
int ret = 1;
while(b) {
if(b & 1)
ret = ret * a % p;
a = a * a % p;
b>>= 1;
}
return ret;
}
int main() {
freopen("1004.in", "r", stdin);
scanf("%d%d%d", &sr, &sb, &sg);
scanf("%d%d", &m, &p);
long long t = (long long)1;
int n = sr + sb + sg;
for(int i = 1; i <= sr; ++i) t = t * (n - i + 1)/i;
ans = ans * (t % p) % p;
n-= sr; t = 1;
for(int i = 1; i <= sg; ++i) t = t * (n - i + 1)/i;
ans = ans * (t % p) % p;
ans = (ans * quick_pow(m + 1, p - 2)) % p;
printf("%d", ans);
return 0;
}