lucas定理 FOJ 2020 组合
Accept: 886 Submit: 2084
Time Limit: 1000 mSec Memory Limit : 32768 KB
Problem Description
Input
Output
Sample Input
Sample Output
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 组合相关推荐
- 『Lucas定理以及拓展Lucas』
Lucas定理 在『组合数学基础』中,我们已经提出了\(Lucas\)定理,并给出了\(Lucas\)定理的证明,本文仅将简单回顾,并给出代码. \(Lucas\)定理:当\(p\)为质数时,\(C_ ...
- 基本计数、排列组合与Lucas定理
基本计数原理 加法原理与分类计数法 要完成一件任务,可以经过n种相互无重叠的方案,若第i种方案的方法数为ai,那么完成这件任务的总方案数为 a 1 + a 2 + a 3 + . . . + a n ...
- 《算法竞赛进阶指南》数论篇(3)-组合计数,Lucas定理,Catalan数列,容斥原理,莫比乌斯反演,概率与数学期望,博弈论之SG函数
文章目录 组合计数 例题:Counting swaps Lucas定理 Cnm≡Cnmodpmmodp∗Cn/pm/p(modp)C_n^m\equiv C_{n\ mod\ p}^{m\ mod\ ...
- 【排列组合】 组合(lucas定理)
题目描述 给出组合数 C(n,m) 表示从 n 个元素中选出 m 个元素的方案数.例如 C(5,2)=10,C(4,2)=6.可是当 n,m 比较大的时候,C(n,m) 很大.于是 xiaobo 希望 ...
- szucodeforce训练1081C组合数学lucas定理,div2 627的D dfs +剪枝优化,697D Puzzles{dfs序+概率}
给你n个方格排成一行,有m种颜色,然后要把这n个方格分成k+1段,每段涂不同的颜色,问有多少种方法. 组合数学Lucas定理 排列组合问题,首先要在n-1个位置里面选出k个位置当作段与段的分割点,然后 ...
- hdu 3037 Lucas定理
题目可以转换成 x1+x2+--+xn=m 有多少组解,m在题中可以取0-m. x1+x2+...+xn = m的解的个数,利用插板法可以得到方案数为: (m+1)*(m+2)...(m+n-1) = ...
- stone (组合数学 + Lucas定理)
传送门 解题思路:第i组的人数必须大于Ci,于是我们可以将问题转化为\(N-\sum_{i=1}^M Ci\)人分到M组中,且保证每一组的人数大于0,然后我们可以使用隔板法求出分的的组数\(C_{N- ...
- Lucas定理与大组合数的取模的求法总结
Lucas定理与大组合数的取模的求法总结 分类: ACMer 数学 2012-03-11 09:38 1219人阅读 评论(0) 收藏 举报 c 首先给出这个Lucas定理: A.B是非负整数 ...
- Lucas 定理学习笔记
Lucas 定理 Lucas 定理用于求解大组合数取模的问题,其中模数必须为素数.正常的组合数运算可以通过递推公式求解(详见排列组合),但当问题规模很大,而模数是一个不大的质数的时候,就不能简单地通过 ...
最新文章
- 研究院引进:博士70万;硕士40万
- PL/SQL流程控制语句
- 访问DBGRIDEH中的行与列
- url携带的参数获取并处理demo
- php 判断update返回为0_PHP empty函数判断0返回真还是假
- 使用PLupload在同一页面中进行多个不同类型上传解决方案和一次多文件上传的注意事项...
- 36岁,还要不要去互联网公司
- 富士相机设置传原图_更稳更快更小巧 富士轻旗舰X-S10无反相机评测
- 数据通信基础(面试必备)
- delphi利用bing翻译API做的多国语言翻译软件
- DNS 和 BIND 详解
- [haut] 1281: 邪能炸弹 dp
- php如何本地运行_怎样在本地运行PHP
- DIV布局强制英文换行(div英文不怎么给力啊~ 只有用别的方法啦)
- 10G 82599EB 网卡测试优化 ethtool
- 闪存中的NorFlash、NandFlash及eMMC三者的区别
- Java根据子节点查找父节点
- 《深入理解Elasticsearch(原书第2版)》一1.1.4 Lucene查询语言
- 用QuartusII 操作操作1位全加法器单位延时仿真
- 操盘手曝光神秘庄家下单要诀