• [HNOI2008]Cards


    题目描述

    小春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目前小春只有3种颜色:红色,蓝色,绿色.他询问Sun有多少种染色方案,Sun很快就给出了答案.

    进一步,小春要求染出Sr张红色,Sb张蓝色,Sg张绿色.他又询问有多少种方案,Sun想了一下,又给出了正确答案. 最后小春发明了M种不同的洗牌法,这里他又问Sun有多少种不同的染色方案.两种染色方法相同当且仅当其中一种可以通过任意的洗牌法(即可以使用多种洗牌法,而每种方法可以使用多次)洗成另一种.

    Sun发现这个问题有点难度,决定交给你,答案可能很大,只要求出答案除以P的余数(P为质数).

    SOL:

    输入数据保证任意多次洗牌都可用这 m种洗牌法中的一种代替,且对每种

    洗牌法,都存在一种洗牌法使得能回到原状态。

    所以每一种置换都是几个大小非1轮换的乘积。(若有1的话,那么就不能同时达到两个条件了,这是显然的)

    所以没有一个置换(除原置换外)有不动点。

    所以根据burnside引理,答案就是(a+b+c)!/(a!*b!*c!*(m+1))

    而且保证p为质数,就省得打孙子剩余定理了,只要费马小定理就ok。

    #include<bits/stdc++.h>
    #define LL long long
    #define N 123
    using namespace std;
    int a,b,c,d,e,fac[N],ni[N],T,answ;
    LL qsm(LL x,LL y){
        LL ans=1;
        while (y) {
            if (y&1) (ans*=x)%=e;
            y>>=1; (x*=x)%=e;
        }
        return ans;
    }
    int main () {
        scanf("%d%d%d%d%d",&a,&b,&c,&d,&e);//不用读完所有的数据
        fac[0]=1;T=a+b+c;
        for (int i=1;i<=T;i++) fac[i]=fac[i-1]*i%e;
        ni[T]=qsm(fac[T],e-2);
        for (int i=T;i  ;i--)  ni[i-1]=ni[i]*i%e;
        answ=fac[T]*ni[a]%e*ni[b]%e*ni[c]%e*qsm(d+1,e-2)%e;
        printf("%d",answ);
    }
  • 相关阅读:
    逆向挑战赛Bob Doge 和 who is he
    [ACTF新生赛2020]rome
    [ACTF新生赛2020]usualCrypt
    MAZE
    $FFT/NTT/FWT$题单&简要题解
    普通型生成函数总结
    [BZOJ4817][SDOI2017]树点涂色:Link-Cut Tree+线段树
    [BZOJ3527][ZJOI2014]力:FFT
    长链剖分优化树形DP总结
    Dsu on Tree总结
  • 原文地址:https://www.cnblogs.com/rrsb/p/7944339.html
Copyright © 2020-2023  润新知