bzoj1004 [HNOI2008]Cards
题目
http://www.lydsy.com/JudgeOnline/problem.php?id=1004
题解
emmmm.....................
感觉这道题非常迷耶,根本不知道它想考什么,难度直逼强制在线的SB题
数据保证 “任意多次洗牌都可用这 m种洗牌法中的一种代替,且对每种洗牌法,都存在一种洗牌法使得能回到原状态。” 那不就是说每种本质不同染色方法通过洗牌后一定会得到m种不曾出现的排列方式
那么只要求出一共有多少种排列,再除以m+1,就能得到本质不同的染色方案数
。。。唯一能算得上知识点的,应该就只有除以一个数取模等于乘以这个数的逆元取模
这怕是我生平第一次不读完数据就A题
代码
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#define ll long long
using namespace std;
int Sr,Sb,Sg,n,m,p;
ll ans,tmp;
ll ksm(int x,int y)
{
ll cnt=1;
while(y)
{
if(y&1) cnt=(cnt*x)%p;
x=(x*x)%p;y=y>>1;
}
return cnt;
}
int main()
{
scanf("%d%d%d%d%d",&Sr,&Sb,&Sg,&m,&p);
n=Sr+Sb+Sg;
tmp=1;
for(int i=1;i<=Sr;i++) tmp=tmp*(n-i+1)/i;
ans=tmp%p;tmp=1;n-=Sr;
for(int i=1;i<=Sb;i++) tmp=tmp*(n-i+1)/i;
ans=(ans*tmp)%p;tmp=1;n-=Sb;
for(int i=1;i<=Sg;i++) tmp=tmp*(n-i+1)/i;
ans=(ans*tmp)%p;
printf("%d",ans*ksm(m+1,p-2)%p);
return 0;
}