您的位置:首页 > 其它

大组合数取模——fzu 2020(可做模板)

2012-01-11 14:38 477 查看
http://blog.csdn.net/swm8023/article/details/6525980

比较好的资料

求C(10,3,107)

第一步: 10/3

第二步: *9/2

第三步:*8/1

如第一步里会出现除不下时的情况,用中国剩余定理做

View Code

#include<iostream>
#include<stdio.h>
using namespace std;
int pow_mod(int a,int n,int p)
{
int ans=1,t=a;
while(n)
{
if(n&1)
ans=(long long)ans*t%p;
t=(long long)t*t%p;
n>>=1;
}
return ans;
}
int cal(int n,int m,long p)
{
if(m>n-m) m=n-m;
int ans=1;
for(int i=1;i<=m;i++)
{
ans=(long long)ans*(n-i+1)%p;
int a=pow_mod(i,p-2,p);
ans=(long long)ans*a%p;
}
return ans;
}

int com_mod(int n,int m,long p)
{
if(n<m)return 0;
return cal(n,m,p);
}

int lucas(int n,int m,long p)
{
int r=1;
while(n&&m&&r)
{
r=(long long)r*com_mod(n%p,m%p,p)%p;
n/=p;
m/=p;
}
return r;
}

int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,m,p;
scanf("%d%d%d",&n,&m,&p);
printf("%d\n",lucas(n,m,p));
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: