您的位置:首页 > 其它

[模板]-卢卡斯(Lucas)定理

2018-03-30 20:48 483 查看
题目描述:

给定n,m,p(1≤n,m,p≤1051≤n,m,p≤105)

求 Cmn+m mod p

保证P为prime

C表示组合数。

一个测试点内包含多组数据。

代码:

long long n,m,p,fac[100010];
void fact()//计算1到p的阶乘并对p取模
{
fac[0] = 1;
for(int i = 1; i <= p; ++i)
fac[i] = fac[i - 1] * i % p;
}
long long QuickPower(long long a,long long n)//快速幂,对p取模
{
long long ans = 1;
while(n > 0)
{
if(n & 1)
ans = ans * a % p;// mod!!!
n /= 2;
a = a * a % p;// mod!!!
}
return ans;
}
long long C(long long n,long long m)//组合数
{
if(m > n)
return 0;
return fac
* QuickPower(fac[m] * fac[n - m],p - 2) % p;
}
long long Lucas(long long n,long long m)//卢卡斯定理
{
if(m == 0)
return 1;
return (C(n % p,m % p) * Lucas(n / p,m / p)) % p;//递归
}
int main()
{
int _;
cin >> _;
while(_--)
{
scanf("%lld%lld%lld",&n,&m,&p);
fact();//位置
printf("%lld\n",Lucas(n + m,m));
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: