BZOJ 1004: [HNOI2008]Cards Polya计数+DP

Polya计数+dp求满足对应循环的不动点有几个

1004: [HNOI2008]CardsTime Limit:10 SecMemory Limit:162 MBSubmit:2046Solved:1212[Submit][Status][Discuss]Description

小春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目前小春只有3种颜色:红色,蓝色,绿色.他询问Sun有多少种染色方案,Sun很快就给出了答案.进一步,小春要求染出Sr张红色,Sb张蓝色,Sg张绝色.他又询问有多少种方案,Sun想了一下,又给出了正确答案. 最后小春发明了M种不同的洗牌法,这里他又问Sun有多少种不同的染色方案.两种染色方法相同当且仅当其中一种可以通过任意的洗牌法(即可以使用多种洗牌法,而每种方法可以使用多次)洗成另一种.Sun发现这个问题有点难度,决定交给你,答案可能很大,只要求出答案除以P的余数(P为质数).

Input

第一行输入 5 个整数:Sr,Sb,Sg,m,p(m<=60,m+1<p<100)。n=Sr+Sb+Sg。接下来 m 行,每行描述一种洗牌法,,每行有 n 个用空格隔开的整数 X1X2…Xn,恰为 1 到 n 的一个排列,表示使用这种洗牌法,第 i位变为原来的 Xi位的牌。输入数据保证任意多次洗牌都可用这 m种洗牌法中的一种代替,且对每种洗牌法,都存在一种洗牌法使得能回到原状态。

Output

不同染法除以P的余数

Sample Input

1 1 1 2 72 3 13 1 2

Sample Output

2

HINT

有2 种本质上不同的染色法RGB 和RBG,使用洗牌法231 一次可得GBR 和BGR,使用洗牌法312 一次 可得BRG 和GRB。100%数据满足 Max{Sr,Sb,Sg}<=20。

/* ***********************************************Author:CKbossCreated Time :2015年05月07日 星期四 09时37分37秒File Name:BZOJ1004.cpp************************************************ */#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <string>#include <cmath>#include <cstdlib>#include <vector>#include <queue>#include <set>#include <map>using namespace std;typedef long long int LL;LL r,g,b,m,Mod,n;LL xp[100];void ex_gcd(LL a,LL b,LL& d,LL& x,LL &y){if(!b) { d=a; x=1; y=0; }else { ex_gcd(b,a%b,d,y,x); y-=x*(a/b); }}LL inv(LL a,LL n=Mod){LL d,x,y;ex_gcd(a,n,d,x,y);return (d==1)?(x+n)%n:-1;}LL JieCheng(LL x){LL ret=1;for(LL i=2;i<=x;i++) ret=(ret*i)%Mod;return ret;}bool vis[100];LL deep;vector<LL> V;void dfs(LL u){vis[u]=true;LL v=xp[u];if(vis[v]==false) { deep++; dfs(v); }}LL dp[110][30][30];int main(){//freopen("in.txt","r",stdin);//freopen("out.txt","w",stdout);scanf("%lld%lld%lld%lld%lld",&r,&g,&b,&m,&Mod);n=r+g+b;LL ans=JieCheng(n)*inv(JieCheng(r))*inv(JieCheng(g))*inv(JieCheng(b));for(LL i=1;i<=m;i++){for(LL j=1;j<=n;j++) scanf("%lld",&xp[j]);memset(vis,false,sizeof(vis)); V.clear();V.push_back(0);for(LL j=1;j<=n;j++){if(vis[j]==false){deep=1; dfs(j);V.push_back(deep);}}memset(dp,0,sizeof(dp));dp[0][0][0]=1;LL presum=0;LL sz=V.size();for(LL j=1;j<sz;j++){presum+=V[j];for(LL R=0;R<=r;R++){for(LL G=0;G<=g;G++){LL B=presum-R-G;if(V[j]<=R){dp[j][R][G]+=dp[j-1][R-V[j]][G];}if(V[j]<=G){dp[j][R][G]+=dp[j-1][R][G-V[j]];}if(V[j]<=B){dp[j][R][G]+=dp[j-1][R][G];}}}}ans=(ans+dp[sz-1][r][g])%Mod;}ans=(ans*inv(m+1))%Mod;printf("%lld\n",ans);return 0;}

当一个人把寂寞当作人生预约的美丽,

BZOJ 1004: [HNOI2008]Cards Polya计数+DP

相关文章:

你感兴趣的文章:

标签云: