zoukankan      html  css  js  c++  java
  • 组合数取模(逆元+快速幂(转)

        组合数公式:

    我们需要求阶乘和逆元阶乘

     我们就用1e9+7来求余吧

    费马小定理

    a^(p-1) ≡1 (mod p)

    两边同除以a

    a^(p-2) ≡1/a (mod p)

    数论1/a 是inv(a)

    应该写a^(p-2) ≡ inv(a) (mod p)

    所以inv(a) = a^(p-2) (mod p)

    这个用快速幂求一下,复杂度O(logn)

    引用其他人写的一句话

    除法求模不能类似乘法,对于(A/B)mod C,直接(A mod C)/ (B mod C)是错误的;找到B的逆元b(b=B^-1);求出(A*b)modC即可;

    由费马小定理:B 关于 P 的逆元为  B^(p-2);

    费马小定理(Fermat Theory)是数论中的一个重要定理,其内容为: 假如p是质数,且gcd(a,p)=1,那么 a(p-1)≡1(mod p)。即:假如a是整数,p是质数,且a,p互质(即两者只有一个公约数1),那么a的(p-1)次方除以p的余数恒等于1。所以,a^-1*a=1=a^(p-1),所以:a^-1=a^(p-2);
    数学排列组合公式:C(n,m)= n!/(m!*(n-m)!)

    /////////////////////////////////////////////////////////////////////////////////////////////////////

    LL pow_mod(LL a, LL b, LL p){//a的b次方求余p                        /
    LL ret = 1;                                                                                    
    while(b){
    if(b & 1) ret = (ret * a) % p;
    a = (a * a) % p;
    b >>= 1;
    }
    return ret;
    }
    LL Fermat(LL a, LL p){//费马求a关于b的逆元
    return pow_mod(a, p-2, p);
    }

    /////////////////////////////////////////////////////////////////////////////////////////////////

    1. #include<cstdio>
    2. #include<cstring>
    3. #include<algorithm>
    4. using namespace std;
    5. #define LL long long
    6. #define G 1100000
    7. #define mod 1000003
    8. LL pri[G];
    9. LL ni[G],ans;
    10. LL pow(LL a,int b)
    11. {
    12. LL ans=1,base=a;
    13. while (b>0)
    14. {
    15. if (b%2==1)   
    16. ans=(base*ans)%mod;
    17. base=(base*base)%mod;
    18. b/=2;
    19. }
    20. return ans;
    21. }
    22. void s() //打表
    23. {
    24. pri[0]=1;
    25. ni[0]=1;
    26. for (int i=1;i<G ;i++)
    27. {
    28. pri[i]=pri[i-1]*i%mod; //N!
    29. ni[i]=pow(pri[i],mod-2);
    30. }
    31. }
    32. int main()
    33. {
    34. s();
    35. int t,n,b,k=1;
    36. scanf("%d",&t);
    37. while (t--)
    38. {
    39. scanf("%d%d",&n,&b);
    40. ans=((pri[n]*ni[b]%mod)*ni[n-b])%mod; // C(n,m)= n!/(m!*(n-m)!)//就是上面公式的表示
    41. printf("Case %d: %lld ",k++,ans);
    42. }
    43. return 0;
    44. }

                                                                                                      

                                                                                                                                                                                                                                                                       2019.2.22

                                                                                                                                                                                                 一只现在很饱的猴猴

  • 相关阅读:
    SQL语法之DDL和DML
    流的装饰模式
    SharePoint 通过客户端API访问SharePoint状态栏
    SQL Server 2008 阻止保存要求重新创建表的更改问题的设置方法
    30个特别酷的SharePoint站点
    在Sharepoint站点状态栏显示列表内容数据
    在SharePoint2010中如何使用状态栏?
    SPGridView and Pagination in SharePoint SharePoint中的SPGridView和分页功能
    一步步教你在SharePoint站点创建具有分页、排序、筛选功能的SPGridView Web部件
    使用对象模型读取SharePoint列表
  • 原文地址:https://www.cnblogs.com/pipihoudewo/p/10420625.html
Copyright © 2011-2022 走看看