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;
}
posted @ 2017-08-16 16:50  XYZinc  阅读(123)  评论(0编辑  收藏  举报