【Lucas定理】FZU2020
来源:互联网 发布:sql三大范式 编辑:程序博客网 时间:2024/06/06 16:34
博客:http://blog.csdn.net/acdreamers/article/details/8037918
Problem 2020 组合
Accept: 1091 Submit: 2646
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
25 2 35 2 61
Sample Output
110
Source
FOJ有奖月赛-2011年04月(校赛热身赛)/*FZU 2020题意:T组数,每组数n,m,p求C(n,m)%p(1 <= m <= n <= 10^9, m <= 10^4, m < p < 10^9, p是素数)n! (n-m)!与p互质,且p为素数所以用费马小定理求逆元n,m范围大 用Lucas定理*//*之前把p当全局超时了,输出%lld WA*/#include <cstdio>typedef long long LL;LL quickpow(LL x,LL n,LL p){ LL ans=1; x%=p; while(n) { if(n&1) ans=ans*x%p; x=x*x%p; n>>=1; } return ans;}LL C(LL n,LL m,LL p){ if(n<m) return 0; if(n-m<m) m=n-m; LL up=1,down=1; for(int i=1; i<=m; i++) { up=up*(n-i+1)%p; down=down*i%p; } return up*quickpow(down,p-2,p)%p;}LL Lucas(LL n,LL m,LL p){ if(m==0) return 1; return C(n%p,m%p,p)*Lucas(n/p,m/p,p)%p;}int main(){ int t; LL n,m,p; scanf("%d",&t); while(t--) { scanf("%I64d%I64d%I64d",&n,&m,&p); printf("%I64d\n",Lucas(n,m,p)); } return 0;}
0 0
- 【Lucas定理】FZU2020
- 【FZU2020】【Lucas模板题】【求组合数取模】
- Lucas 定理
- Lucas 定理
- lucas定理
- Lucas定理
- Lucas 定理
- Lucas 定理
- Lucas 定理
- Lucas 定理
- Lucas定理
- lucas定理
- lucas定理
- Lucas定理
- Lucas定理
- Lucas 定理。。。
- lucas定理
- Lucas定理
- 使用curl 命令模拟POST/GET请求
- oracle用户创建及权限设置
- iOS10.3后允许App运行中变更App图标
- Openstack Horizon workflows
- [leetcode]473. Matchsticks to Square
- 【Lucas定理】FZU2020
- 02-线性结构4 Pop Sequence (25分)
- HDFS NameNode内存详解
- Android插件化基础之加载已安装的apk资源
- NEO4J数据处理及显示功能
- CWE --- Time-of-check Time-of-use (TOCTOU) 例子 和 mitigation
- 集成度相当高的下拉刷新控件
- 约瑟夫问题
- Markdown编辑器使用方法留存