zoukankan      html  css  js  c++  java
  • [Noip2011]计算系数

    Sol1:利用杨辉三角求C(N,M).坐标从 (0,0)开始,则第n行第m列就是C(N,M)

    #include<bits/stdc++.h>
    #define s 1100
    using namespace std;
    int x[s][s];
    main()
    {
        int a,b,k,n,m;
        x[0][0]=1;
        scanf("%d%d%d%d%d",&a,&b,&k,&n,&m);
        a%=10007;
        b%=10007;
        for(int i=1;i<=k;i++)
           for(int j=0;j<=i;j++)
        	x[i][j]=(x[i-1][j]+x[i-1][j-1])%10007;}
        
        int product=x[k][n];
        for(int i=1;i<=n;i++)product=product*a%10007;
        for(int i=1;i<=m;i++)product=product*b%10007;
        printf("%d",product);
        return 0;
    }
    

      

    Sol2:

    直接算组合数C(N,M)=分子/分母,然后在取模的时候,求出分母这一个数字针对P的逆元即可。

    当然也可以在计算过程中,算出1到m每个数字针对P的逆元。转化成N*(N-1)*(N-2)*(N-M_1) * 1的逆元 * 2的逆元 * 3的逆元*.....M的逆元

    求逆元的几种方法

    1:单个数字可以用扩欧来求解

    2:1--N之间所有数字,可以递推求解

    3:用欧拉定理,直接找出逆元。

    #include<bits/stdc++.h>
    using namespace std;
    const int mod=10007;
    long long ksm(long long a,long long b)
    {
        if(b==0)return 1;
        if(b%2==0)return ksm(a,b>>1)*ksm(a,b>>1)%mod;
        else return a*ksm(a,b>>1)*ksm(a,b>>1)%mod;
    }
    int main()
    {
        int a,b,k,m,n;
        cin>>a>>b>>k>>n>>m;
        int c=1,d=1;
        for(int i=1;i<=n;i++)
            c=c*i%mod;
        for(int i=k-n+1;i<=k;i++)
            d=d*i%mod;
        d=d*ksm(c,mod-2)%mod;
        d=d*ksm(a,n)*ksm(b,m)%mod;
        cout<<d;
    }
    

      

  • 相关阅读:
    MD5工具类
    新搭建mysql容易出现问题
    docker自动化部署
    k8s入门案例
    docker单一部署jenkins
    Sentinel 学习-简介
    mysql innerjoin,leftjoin,group by,having
    批量更新 分割list 多线程处理
    redis 3.0+ cluser 集群搭建
    ELK 和 Logstach
  • 原文地址:https://www.cnblogs.com/cutemush/p/12005107.html
Copyright © 2011-2022 走看看