lucas定理 FOJ 2020 组合
2016-05-22 19:45
204 查看
Problem 2020 组合
Accept: 886 Submit: 2084
未预处理阶乘(在组合数函数中写了个循环):
预处理阶乘(有时可以加快速度,相乘时也要防止溢出):
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 61Sample Output
1 10未预处理阶乘(在组合数函数中写了个循环):
#include<iostream> using namespace std; #include<cstdio> #define ll long long int t; ll quick_mod(ll a,ll b,ll p)// a^b%p { a%=p; ll ans=1; while(b) { if(b&1) { b--; ans=(ans*a)%p; } b>>=1; a=(a*a)%p; } return ans; } ll C(ll n, ll m,ll p) { if(m>n) return 0; ll ans=1,a,b; for(int i=1;i<=m;++i) { a=(n+i-m)%p; b=i%p; ans=ans*(a*quick_mod(b,p-2,p)%p)%p; } return ans; } ll lucas(ll n,ll m,ll p) { if(m==0) return 1; return (lucas(n/p,m/p,p)*C(n%p,m%p,p))%p; } int main() { scanf("%d",&t); while(t--) { ll n,m,p; cin>>n>>m>>p; cout<<lucas(n,m,p)<<endl; } return 0; }
预处理阶乘(有时可以加快速度,相乘时也要防止溢出):
/*事实上,这道题目预处理阶乘,反而会更慢,因为题目中n,m都是10^9,预处理已经接近超时了*/ #include<iostream> using namespace std; #include<cstdio> #define S 10000000 #define ll long long int t; long long f[1000000]; void yuchuli(ll p) { f[0]=1; for(int i=1;i<=S;++i) f[i]=f[i-1]*i%p; } ll quick_mod(ll a,ll b,ll p) { a%=p; ll ans=1; while(b) { if(b&1) { b--; ans=(ans*a)%p; } b>>=1; a=(a*a)%p; } return ans; } ll C(ll n, ll m,ll p) { if(m>n) return 0; return (f *quick(f[m]*f[n-m],p-2,p))%p; } ll lucas(ll n,ll m,ll p) { if(m==0) return 1; return (lucas(n/p,m/p,p)*C(n%p,m%p,p))%p; } int main() { scanf("%d",&t); while(t--) { ll n,m,p; cin>>n>>m>>p; cout<<lucas(n,m,p)<<endl; } return 0; }
相关文章推荐
- POJ 1787 Charlie's Change (多重背包 带结果组成)
- 2016-5-22 百度之星第三题--瞬间移动
- gulp-express实现node-express项目实时刷新
- 龙芯3B处理器—地址映射以及路由地址分布与配置
- javascript语法之字符串转换成数字
- javascript语法之字符串转换成数字
- 2016第21周日
- list()构造:一种从数组中方便获取值的方法
- 几种排序算法总结
- Java之流水号生成器
- HDU 5695 Gym Class 拓扑排序
- 学习进度条12
- 厌
- 高性能网站建设指南
- Linux 实用命令
- javascript语法之声明变量
- javascript语法之声明变量
- 数据库连接异常
- bzoj 4552: [Tjoi2016&Heoi2016]排序
- 关于Activity与Fragment混用中对于startActivityForResult方法的解析