Problem 2020 组合

Accept: 886    Submit: 2084
Time Limit: 1000 mSec    Memory Limit : 32768 KB

Problem Description

给出组合数C(n,m), 表示从n个元素中选出m个元素的方案数。例如C(5,2) = 10, C(4,2) = 6.可是当n,m比较大的时候,C(n,m)很大!于是xiaobo希望你输出 C(n,m) mod p的值!

Input

输入数据第一行是一个正整数T,表示数据组数 (T <= 100) 接下来是T组数据,每组数据有3个正整数 n, m, p (1 <= m <= n <= 10^9, m <= 10^4, m < p < 10^9, p是素数)

Output

对于每组数据,输出一个正整数,表示C(n,m) mod p的结果。

Sample Input

2 5 2 3 5 2 61

Sample Output

1 10 
未预处理阶乘(在组合数函数中写了个循环):
 1 #include<iostream>
 2 using namespace std;
 3 #include<cstdio>
 4 #define ll long long
 5 int t;
 6 ll quick_mod(ll a,ll b,ll p)// a^b%p
 7 {
 8     a%=p;
 9     ll ans=1;
10     while(b)
11     {
12         if(b&1)
13         {
14             b--;
15             ans=(ans*a)%p;
16         }
17         b>>=1;
18         a=(a*a)%p;
19     }
20     return ans;
21 }
22 ll C(ll n, ll m,ll p)
23 {
24     if(m>n) return 0;
25     ll ans=1,a,b;
26     for(int i=1;i<=m;++i)
27     {
28         a=(n+i-m)%p;
29         b=i%p;
30         ans=ans*(a*quick_mod(b,p-2,p)%p)%p;
31     }
32     return ans;
33 }
34 ll lucas(ll n,ll m,ll p)
35 {
36     if(m==0) return 1;
37     return (lucas(n/p,m/p,p)*C(n%p,m%p,p))%p;
38 }
39 int main()
40 {
41     scanf("%d",&t);
42     while(t--)
43     {
44         ll n,m,p;
45         cin>>n>>m>>p;
46         cout<<lucas(n,m,p)<<endl;
47     }
48     return 0;
49 }

预处理阶乘(有时可以加快速度,相乘时也要防止溢出):

 1 /*事实上,这道题目预处理阶乘,反而会更慢,因为题目中n,m都是10^9,预处理已经接近超时了*/
 2 #include<iostream>
 3 using namespace std;
 4 #include<cstdio>
 5 #define S 10000000
 6 #define ll long long
 7 int t;
 8 long long f[1000000];
 9 void yuchuli(ll p)
10 {
11     f[0]=1;
12     for(int i=1;i<=S;++i)
13       f[i]=f[i-1]*i%p;
14 }
15 ll quick_mod(ll a,ll b,ll p)
16 {
17     a%=p;
18     ll ans=1;
19     while(b)
20     {
21         if(b&1)
22         {
23             b--;
24             ans=(ans*a)%p;
25         }
26         b>>=1;
27         a=(a*a)%p;
28     }
29     return ans;
30 }
31 ll C(ll n, ll m,ll p)
32 {
33     if(m>n) return 0;
34     return (f[n]*quick(f[m]*f[n-m],p-2,p))%p;
35 }
36 ll lucas(ll n,ll m,ll p)
37 {
38     if(m==0) return 1;
39     return (lucas(n/p,m/p,p)*C(n%p,m%p,p))%p;
40 }
41 int main()
42 {
43     scanf("%d",&t);
44     while(t--)
45     {
46         ll n,m,p;
47         cin>>n>>m>>p;
48         cout<<lucas(n,m,p)<<endl;
49     }
50     return 0;
51 }

转载于:https://www.cnblogs.com/c1299401227/p/5517575.html

lucas定理 FOJ 2020 组合相关推荐

  1. 『Lucas定理以及拓展Lucas』

    Lucas定理 在『组合数学基础』中,我们已经提出了\(Lucas\)定理,并给出了\(Lucas\)定理的证明,本文仅将简单回顾,并给出代码. \(Lucas\)定理:当\(p\)为质数时,\(C_ ...

  2. 基本计数、排列组合与Lucas定理

    基本计数原理 加法原理与分类计数法 要完成一件任务,可以经过n种相互无重叠的方案,若第i种方案的方法数为ai,那么完成这件任务的总方案数为 a 1 + a 2 + a 3 + . . . + a n ...

  3. 《算法竞赛进阶指南》数论篇(3)-组合计数,Lucas定理,Catalan数列,容斥原理,莫比乌斯反演,概率与数学期望,博弈论之SG函数

    文章目录 组合计数 例题:Counting swaps Lucas定理 Cnm≡Cnmodpmmodp∗Cn/pm/p(modp)C_n^m\equiv C_{n\ mod\ p}^{m\ mod\ ...

  4. 【排列组合】 组合(lucas定理)

    题目描述 给出组合数 C(n,m) 表示从 n 个元素中选出 m 个元素的方案数.例如 C(5,2)=10,C(4,2)=6.可是当 n,m 比较大的时候,C(n,m) 很大.于是 xiaobo 希望 ...

  5. szucodeforce训练1081C组合数学lucas定理,div2 627的D dfs +剪枝优化,697D Puzzles{dfs序+概率}

    给你n个方格排成一行,有m种颜色,然后要把这n个方格分成k+1段,每段涂不同的颜色,问有多少种方法. 组合数学Lucas定理 排列组合问题,首先要在n-1个位置里面选出k个位置当作段与段的分割点,然后 ...

  6. hdu 3037 Lucas定理

    题目可以转换成 x1+x2+--+xn=m 有多少组解,m在题中可以取0-m. x1+x2+...+xn = m的解的个数,利用插板法可以得到方案数为: (m+1)*(m+2)...(m+n-1) = ...

  7. stone (组合数学 + Lucas定理)

    传送门 解题思路:第i组的人数必须大于Ci,于是我们可以将问题转化为\(N-\sum_{i=1}^M Ci\)人分到M组中,且保证每一组的人数大于0,然后我们可以使用隔板法求出分的的组数\(C_{N- ...

  8. Lucas定理与大组合数的取模的求法总结

    Lucas定理与大组合数的取模的求法总结 分类: ACMer 数学 2012-03-11 09:38  1219人阅读  评论(0)  收藏  举报 c 首先给出这个Lucas定理: A.B是非负整数 ...

  9. Lucas 定理学习笔记

    Lucas 定理 Lucas 定理用于求解大组合数取模的问题,其中模数必须为素数.正常的组合数运算可以通过递推公式求解(详见排列组合),但当问题规模很大,而模数是一个不大的质数的时候,就不能简单地通过 ...

最新文章

  1. 研究院引进:博士70万;硕士40万
  2. PL/SQL流程控制语句
  3. 访问DBGRIDEH中的行与列
  4. url携带的参数获取并处理demo
  5. php 判断update返回为0_PHP empty函数判断0返回真还是假
  6. 使用PLupload在同一页面中进行多个不同类型上传解决方案和一次多文件上传的注意事项...
  7. 36岁,还要不要去互联网公司
  8. 富士相机设置传原图_更稳更快更小巧 富士轻旗舰X-S10无反相机评测
  9. 数据通信基础(面试必备)
  10. delphi利用bing翻译API做的多国语言翻译软件
  11. DNS 和 BIND 详解
  12. [haut] 1281: 邪能炸弹 dp
  13. php如何本地运行_怎样在本地运行PHP
  14. DIV布局强制英文换行(div英文不怎么给力啊~ 只有用别的方法啦)
  15. 10G 82599EB 网卡测试优化 ethtool
  16. 闪存中的NorFlash、NandFlash及eMMC三者的区别
  17. Java根据子节点查找父节点
  18. 《深入理解Elasticsearch(原书第2版)》一1.1.4 Lucene查询语言
  19. 用QuartusII 操作操作1位全加法器单位延时仿真
  20. 操盘手曝光神秘庄家下单要诀

热门文章

  1. Java 性能优化实战记录(3)--JVM OOM的分析和原因追查
  2. 找出数组中两个只出现一次的数字
  3. 永远不要相信用户的输入
  4. linux经典书籍--linux系统编程手册
  5. ISR:中断服务程序需要满足的要求
  6. Java-CAS初探
  7. Docker中运行EOS FOR MAC
  8. JavaScript 中对象的属性类型
  9. AGG第四课 局限性
  10. 爱数的诗和远方:云端数据运营服务