概述
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
110
#include<stdio.h> #include<iostream> #include<string.h> #include<algorithm> #include<queue> using namespace std; __int64 power(__int64 a,__int64 b,__int64 n) { __int64 res=1; while(b) { if(b&1) res=res*a%n; b>>=1; a=a*a%n; } return res; } __int64 cal(__int64 n,__int64 r,__int64 p) { __int64 i,res=1,re; for(i=1;i<=r;i++) { res=res*(n-i+1)%p; re=power(i,p-2,p); res=res*re%p; } return res; } __int64 lucas(__int64 n,__int64 m,__int64 p) { if(n<m) return 0; else return cal(n,m,p); } int main() { __int64 n,m,p,res; int t; scanf("%d",&t); while(t--) { scanf("%I64d%I64d%I64d",&n,&m,&p); res=1; while(n&&m) { res=res*lucas(n%p,m%p,p); if(res==0) break; n=n/p; m=m/p; } printf("%I64dn",res); } return 0; }
最后
以上就是怕孤单雨为你收集整理的组合(Lucas)的全部内容,希望文章能够帮你解决组合(Lucas)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复