• [bzoj1004] [HNOI2008]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的余数

    Sample Input

    1 1 1 2 7
    2 3 1
    3 1 2
    

    Sample Output

    2
    

    Solution

    如果没有洗牌这个约束,答案显然就是:

    [ans=inom{a+b+c}{a}cdot inom{b+c}{b}=frac{(a+b+c)!}{a!cdot b!cdot c!} ]

    注意到一个置换必定是其他若干个置换之积,且且对每种洗牌法,都存在一种洗牌法使得能回到原状态,即这些置换构成一个封闭群,所以除了单位元,必定没有一个置换存在不动点,所以根据(bornside)引理可知,最终答案即:

    [ans=frac{(a+b+c)!}{a!cdot b!cdot c!cdot (m+1)} ]

    数据没有必要读完,读第一行就好了。

    #include<bits/stdc++.h>
    using namespace std;
    
    void read(int &x) {
        x=0;int f=1;char ch=getchar();
        for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-f;
        for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';x*=f;
    }
    
    #define write(x) printf("%d
    ",x)
    
    const int maxn = 2e5+10;
    
    int mod;
    
    int qpow(int a,int x) {
        int res=1;
        for(;x;x>>=1,a=1ll*a*a%mod) if(x&1) res=1ll*res*a%mod;
        return res;
    }
    
    int fac(int n) {
        int res=1;
        for(int i=1;i<=n;i++) res=1ll*res*i%mod;
        return res;
    }
    
    int main() {
        int a,b,c,m;read(a),read(b),read(c),read(m),read(mod);
        write(1ll*fac(a+b+c)*qpow(1ll*fac(a)*fac(b)%mod*fac(c)%mod*(m+1)%mod,mod-2)%mod);
        return 0;
    }
    
  • 相关阅读:
    连分数与丢番图方程简介
    利用 random 与 tertools 模块解决概率问题
    Notepad++ 几款实用插件简介,让你的 Notepad++ 如虎添翼
    .net面试问答(大汇总)
    .net反射详解 原文://http://blog.csdn.net/wenyan07/article/details/27882363
    ASP.NET MVC4+EF5(Lambda/Linq)读取数据
    AngularJS+ASP.NET MVC+SignalR实现消息推送
    Asp.net SignalR 实现服务端消息推送到Web端
    C# Socket编程 同步以及异步通信
    C#版 Socket编程(最简单的Socket通信功能)
  • 原文地址:https://www.cnblogs.com/hbyer/p/10349024.html
Copyright © 2020-2023  润新知