bzoj 1004: [HNOI2008]Cards

这也是一道polya定理的题,只不过在求循环节数的时候由于有使用个数限制,所以不能直接快速幂,而是用DP求出每个置换的循环节。DP很简单,近乎于暴力=_=

上代码:

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define N 100
#define M 25
using namespace std;

int n, m, a[N];
int sb, sr, sg;
int yu;
int f[M][M][M];

int mi(int a, int b)
{
    int ans = 1, zan = a;
    while (b)
    {
        if (b & 1)
        {
            ans *= zan;
            if (ans > yu) ans %= yu;
        }
        b >>= 1;
        zan *= zan;
        if (zan > yu) zan %= yu;
    }
    return ans;
}

int cal()
{
    memset(f, 0, sizeof(f));
    int cir[N] = {0}, cirnum = 0;
    bool vis[N] = {0};
    for (int i = 1; i <= n; ++i)
        if (!vis[i])
        {
            cirnum ++; cir[cirnum] = 1;
            vis[i] = 1; int x = a[i];
            while (!vis[x])
            {
                vis[x] = 1;
                cir[cirnum] ++;
                x = a[x];
            }
        }
    f[0][0][0] = 1;
    for (int w = 1; w <= cirnum; ++w)
    for (int i = sr; i >= 0; --i)
    for (int j = sb; j >= 0; --j)
    for (int k = sg; k >= 0; --k)
    {
        if (i - cir[w] >= 0) f[i][j][k] += f[i-cir[w]][j][k];
        if (f[i][j][k] > yu) f[i][j][k] %= yu;
        if (j - cir[w] >= 0) f[i][j][k] += f[i][j-cir[w]][k];
        if (f[i][j][k] > yu) f[i][j][k] %= yu;
        if (k - cir[w] >= 0) f[i][j][k] += f[i][j][k-cir[w]];
        if (f[i][j][k] > yu) f[i][j][k] %= yu;
    }
    return f[sr][sb][sg];
}

int main()
{
    scanf("%d%d%d%d%lld", &sr, &sb, &sg, &m, &yu);
    n = sr+sb+sg;
    int ans = 0;
    for (int i = 1; i <= n; ++i) a[i] = i;
    ans += cal(); if (ans > yu) ans %= yu;
    for (int i = 1; i <= m; ++i)
    {
        for (int i = 1; i <= n; ++i) scanf("%d", &a[i]);
        ans += cal(); if (ans > yu) ans %= yu;
    }
    ans *= mi(m+1, yu-2)%yu;
    printf("%d\n", ans % yu);
}
时间: 2024-11-03 01:35:21

bzoj 1004: [HNOI2008]Cards的相关文章

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

Polya计数+dp求满足对应循环的不动点有几个 1004: [HNOI2008]Cards Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 2046  Solved: 1212 [Submit][Status][Discuss] Description 小春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目前小春只有3种颜色:红色,蓝色,绿色.他询问Sun有多少种染色方案,Sun很快就给出了答案.进一步,小春要求染出Sr张红色,Sb张蓝色,S

[BZOJ 1004] [HNOI2008] Cards 【Burnside引理 + DP】

题目链接:BZOJ - 1004 题目分析 首先,几个定义和定理引理: 群:G是一个集合,*是定义在这个集合上的一个运算. 如果满足以下性质,那么(G, *)是一个群. 1)封闭性,对于任意 a, b 属于 G, a * b 属于 G 2)结合律, a * b * c = a * (b * c) 3)单位元,在 G 中存在一个单位元 e ,使得对于 G 中任意的 a , a * e = e * a = a 4)逆元, 对于 G 中任意的 a ,在 G 中存在 b , 使得 a * b = e ,

BZOJ 1004 HNOI2008 Cards Burnside引理

题目大意:给定n张卡牌和m个置换,求等价类个数 数据保证这m个置换加上自身置换后构成一个置换群 BZOJ坑爹0.0 这么重要的条件不给出来尼玛怎么做 Burnside引理--昨晚为了做这题硬啃了一晚上白书0.0 都快啃吐了0.0 Burnside引理:一个置换群下的等价类个数等于所有置换的不动点个数的平均值 没有接触过群论的建议去啃白书-- 网上的东西看不懂的 最后那个除法要用乘法逆元 我懒得写EXGCD写了费马小定理0.0 #include<cstdio> #include<cstri

[BZOJ 1004][HNOI2008]Cards(Polya定理/Burnside引理)

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

bzoj 1004 1004: [HNOI2008]Cards burnside定理

1004: [HNOI2008]Cards Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1668  Solved: 978[Submit][Status] Description 小 春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目前小春只有3种颜色:红色,蓝色,绿色.他询问Sun有多少种染色方案,Sun很快就给出了答 案.进一步,小春要求染出Sr张红色,Sb张蓝色,Sg张绝色.他又询问有多少种方案,Sun想了一下,又给出了正确答案. 最

【BZOJ】1004: [HNOI2008]Cards(置换群+polya+burnside)

http://www.lydsy.com/JudgeOnline/problem.php?id=1004 学习了下polya计数和burnside引理,最好的资料就是:<Pólya 计数法的应用> --陈瑜希 burnside: $$等价类的个数=\frac{1}{|G|}\sum_{i=1}^{s}D(a_i), a_i \in G$$其中$D(a_i)=a_i置换中染色后不变的方案$ 而polya: $$D(a_i)=k^{C(a_i)},其中C(a_i)是a_i的循环节个数$$证明很简单

1004: [HNOI2008]Cards burnside定理

https://www.lydsy.com/JudgeOnline/problem.php?id=1004 输入数据保证任意多次洗牌都可用这 m种洗牌法中的一种代替,且对每种洗牌法,都存在一种洗牌法使得能回到原状态.(保证置换的完备性) 要考虑1,2,3...n这个置换,然后算出每种置换的方案数,除上总置换数m+1,就是答案,因为有取模,所以需要算逆元,然后对与一种置换来说总的情况数可以用dp来计算,因为每一个置换群只能涂成一种颜色,然后我们需要满足涂的颜色种数满足条件,dp[i][j][k]维

[HNOI2008]Cards

1004: [HNOI2008]Cards Time Limit: 10 Sec  Memory Limit: 162 MB[Submit][Status][Discuss] Description 小春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目前小春只有3种颜色:红色,蓝色,绿色.他询问Sun有多少种染色方案,Sun很快就给出了答案.进一步,小春要求染出Sr张红色,Sb张蓝色,Sg张绝色.他又询问有多少种方案,Sun想了一下,又给出了正确答案. 最后小春发明了M种不同的洗牌法,这里他

【bzoj1004】[HNOI2008]Cards

1004: [HNOI2008]Cards Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2928  Solved: 1754[Submit][Status][Discuss] Description 小春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目前小春只有3种颜色:红色,蓝色,绿色.他询问Sun有多少种染色方案,Sun很快就给出了答案.进一步,小春要求染出Sr张红色,Sb张蓝色,Sg张绝色.他又询问有多少种方案,Sun想了一下,又给出