【HNOI2008】bzoj1004 Cards

2023-11-07 19:48
文章标签 cards hnoi2008 bzoj1004

本文主要是介绍【HNOI2008】bzoj1004 Cards,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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的余数

根据burnside引理,只需要算出各个置换下的不动点个数【注意加上不变的置换】。把置换分解之后,问题就是把每个循环填上一种颜色,求方案数。背包dp即可。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int dp[65][25][25],a[65],f[65],vis[65],sum[65],
s1,s2,s3,n,m,p,tot;
int pow(int a,int x)
{int ret=1;for (;x;x>>=1,a=a*a%p)if (x&1)ret=ret*a%p;return ret;
}
int dfs(int u)
{if (vis[u]) return 0;vis[u]=1;return dfs(a[u])+1;
}
int solve()
{tot=0;for (int i=1;i<=n;i++) vis[i]=0;for (int i=1;i<=n;i++)if (!vis[i]) f[++tot]=dfs(i);sum[0]=0;for (int i=1;i<=tot;i++) sum[i]=sum[i-1]+f[i];memset(dp,0,sizeof(dp));dp[0][0][0]=1;for (int i=1;i<=tot;i++)for (int x=0;x<=s1&&x<=sum[i];x++)for (int y=0;y<=s2&&y<=sum[i];y++){int z=sum[i]-x-y;if (z<0||z>s3) continue;if (x>=f[i]) dp[i][x][y]=(dp[i][x][y]+dp[i-1][x-f[i]][y])%p;if (y>=f[i]) dp[i][x][y]=(dp[i][x][y]+dp[i-1][x][y-f[i]])%p;if (z>=f[i]) dp[i][x][y]=(dp[i][x][y]+dp[i-1][x][y])%p;}return dp[tot][s1][s2];
}
int main()
{int ans=0;scanf("%d%d%d%d%d",&s1,&s2,&s3,&m,&p);n=s1+s2+s3;for (int i=1;i<=m;i++){for (int i=1;i<=n;i++) scanf("%d",&a[i]);ans=(ans+solve())%p;}for (int i=1;i<=n;i++) a[i]=i;ans=(ans+solve())%p;printf("%d\n",ans*pow(m+1,p-2)%p);
}

这篇关于【HNOI2008】bzoj1004 Cards的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/365891

相关文章

poj 1511 Invitation Cards(spfa最短路)

题意是给你点与点之间的距离,求来回到点1的最短路中的边权和。 因为边很大,不能用原来的dijkstra什么的,所以用spfa来做。并且注意要用long long int 来存储。 稍微改了一下学长的模板。 stack stl 实现代码: #include<stdio.h>#include<stack>using namespace std;const int M

【HDU】4876 ZCC loves cards 暴力

传送门:【HDU】4876 ZCC loves cards 题目分析: 这题无力吐嘈。。。。能想到的优化都用上吧。。。 代码如下: #include <cstdio>#include <cstring>#include <algorithm>using namespace std ;#define REP( i , n ) for ( int i =

poj 1721 CARDS(置换)

http://poj.org/problem?id=1721 大致题意:原始序列通过洗牌机洗牌s次后变为当前序列,已知当前序列,求原始序列。 在置换群快速幂运算 研究与探讨中最后有详解,有两种解法,一种是求出置换的长度a(即一副牌洗a次后变回原来的位置),现已知原始序列置换s次变为当前序列,那么当前序列再置换a-s次就是原始序列了。求a就是直接模拟每个置换的过程,直到某序列与当前序

题解:P3569 [POI2014] KAR-Cards

题意 有 n n n 个元素,第 i i i 个元素有两个权值 a i a_i ai​ 和 b i b_i bi​;有 m m m 次操作,每次操作会交换两个元素的位置,且都需要回答:是否存在一种方案,使得每个元素各选择一个权值后,组成的序列从左到右单调不降。 解法 完全可以把交换操作看作两次单点修改,每次只需要考虑一个元素的变化对答案的影响即可。对于一个区间中的元素,显然开

[LightOJ 1364] Expected Cards (高维期望DP)

LightOJ - 1364 一副扑克牌,不断地从中抽牌 要求四种花色都至少要有给定的张数 其中如果抽到了王牌,可以将其变为任意花色 求满足条件时,抽出的期望张数 刚开始想错了,两张王牌并非在一开始就给定了 而是在游戏中可以视当前情况选择着变的 这两种方式是不一样的 由于牌数其实并不会很多, 复杂度乘一乘发现才 107 10^7级别的,所以直接暴力DP 将两张王牌当

HDU 1535 Invitation Cards 2次Dijkstra来回最短路

题目来源:HDU 1535 Invitation Cards 题意:从1派学生到2-n这n-1个点  求去并且回来的最短路 就是1到各点的最短路之和和各点到1的最短路之和 给的是有向图 思路:对于1到各个点的最短路直接Dijkstra求出无压力 然后各个点到1的最短路可以反向建图后再求一次从1到各个点的最短路 对于很多点到一个点的情况可以考虑反向建图 转变成单源最短路 #include <

Codefores 398A Cards(贪心+暴力)

题目链接:Codefores 398A Cards 题目大意:给出a和b,表示说有a个“o”的卡和b个“x”的卡,将这a+b个卡片排成一个序列,每连续的k个相同的卡片为一个数,表示k^2,如果是o,则是+k^2,否则-k^2。要求找到一个序列使得最后的结果尽量大。 解题思路:一开始一直想用贪心的思想直接构造出来,后来和小伙伴一人想了一种构造方法,但是又互相推翻了。。。。不过很快就想

hdu 4610 Cards(暴力+miller-rabin)

题目链接:hdu 4610 Cards 解题思路 用素数筛选法先预处理出每个数的因子个数,因子和。因子个数肯定小于1e6,可以根据预处理的素数表直接判断是否为素数,但是因子和可能到达4百多万,所以直接用miller-rabin直接判素数。 判断因子积是否是平方和的部分,考虑因子个数,如果因子个数为奇数(即该数为平方数),则sqrt(i)必须是平方数才行。如果因子个数为偶数,则cnt/2为偶数

zoj3380 Patchouli's Spell Cards

Patchouli's Spell Cards Time Limit: 7 Seconds Memory Limit: 65536 KB Patchouli Knowledge, the unmoving great library, is a magician who has settled down in the Scarlet Devil Mansion (紅魔館)

bzoj1004[HNOI2008] Cards

题目链接:bzoj1004 题目大意: 有3种颜色:红色,蓝色,绿色。要求染出Sr张红色,Sb张蓝色,Sg张绿色。M种不同的洗牌法,这里问有多少种不同的染色方案。两种染色方法相同当且仅当其中一种可以通过任意的洗牌法(即可以使用多种洗牌法,而每种方法可以使用多次)洗成另一种。要求出答案除以P的余数(P为质数)。100%数据满足 Max{Sr,Sb,Sg}≤20;m≤60,m+1<p<100 输入数据