本文主要是介绍【模板】扩展卢卡斯,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目背景
这是一道模板题。
题目描述
求
C_n^m \bmod{p}Cnmmodp
其中 CC 为组合数。
输入输出格式
输入格式:
一行三个整数 n,m,pn,m,p ,含义由题所述。
输出格式:
一行一个整数,表示答案。
输入输出样例
输入样例#1: 复制
5 3 3
输出样例#1: 复制
1
输入样例#2: 复制
666 233 123456
输出样例#2: 复制
61728
说明
1\leq m\leq n\leq 10^{18},2\leq p\leq 10000001≤m≤n≤1018,2≤p≤1000000 ,不保证 pp 是质数。
证明解释:https://www2.luogu.org/problemnew/solution/P4720
#include<bits/stdc++.h>using namespace std;typedef long long ll;ll exgcd(ll a,ll b,ll &x,ll &y)
{if(!b){x=1;y=0;return a;}ll res=exgcd(b,a%b,x,y),t;t=x;x=y;y=t-a/b*y;return res;
}ll p;inline ll power(ll a,ll b,ll mod)
{ll sm;for(sm=1;b;b>>=1,a=a*a%mod)if(b&1)sm=sm*a%mod;return sm;
}ll fac(ll n,ll pi,ll pk)
{if(!n)return 1;ll res=1;for(register ll i=2;i<=pk;++i)if(i%pi)(res*=i)%=pk;res=power(res,n/pk,pk);for(register ll i=2;i<=n%pk;++i)if(i%pi)(res*=i)%=pk;return res*fac(n/pi,pi,pk)%pk;
}inline ll inv(ll n,ll mod)
{ll x,y;exgcd(n,mod,x,y);return (x+=mod)>mod?x-mod:x;
}inline ll CRT(ll b,ll mod){return b*inv(p/mod,mod)%p*(p/mod)%p;}const int MAXN=11;static ll n,m;static ll w[MAXN];inline ll C(ll n,ll m,ll pi,ll pk)
{ll up=fac(n,pi,pk),d1=fac(m,pi,pk),d2=fac(n-m,pi,pk);ll k=0;for(register ll i=n;i;i/=pi)k+=i/pi;for(register ll i=m;i;i/=pi)k-=i/pi;for(register ll i=n-m;i;i/=pi)k-=i/pi;return up*inv(d1,pk)%pk*inv(d2,pk)%pk*power(pi,k,pk)%pk;
}inline ll exlucus(ll n,ll m)
{ll res=0,tmp=p,pk;static int lim=sqrt(p)+5;for(register int i=2;i<=lim;++i)if(tmp%i==0){pk=1;while(tmp%i==0)pk*=i,tmp/=i;(res+=CRT(C(n,m,i,pk),pk))%=p;}if(tmp>1)(res+=CRT(C(n,m,tmp,tmp),tmp))%=p;return res;
}int main()
{scanf("%lld%lld%d",&n,&m,&p);printf("%d\n",exlucus(n,m));return 0;
}
这篇关于【模板】扩展卢卡斯的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!