隐藏页面特效

codeforces2015ICL,Finals,Div.1#J Ceizenpok’s formula【扩展lucas】

传送门

[题意]:

求C(n,k)%m,n<=108,k<=n,m<=106

[思路]:

扩展lucas定理+中国剩余定理

   

#include<cstdio> using namespace std; typedef long long ll; ll n,m,MOD,ans; ll fpow(ll a,ll p,ll mod){ ll res=1; for(;p;p>>=1,a=a*a%mod) if(p&1) res=res*a%mod; return res; } void exgcd(ll a,ll b,ll &d,ll &x,ll &y){ if(!b){d=a;x=1;y=0;return ;} exgcd(b,a%b,d,y,x); y-=a/b*x; } ll inv(ll a,ll p){ ll d,x,y; exgcd(a,p,d,x,y); return d==1?(x%p+p)%p:-1; } ll mul(ll n,ll pi,ll pk){ if(!n) return 1; ll ans=1; if(n/pk){ for(ll i=2;i<=pk;i++) if(i%pi) ans=ans*i%pk; ans=fpow(ans,n/pk,pk); } for(ll i=2;i<=n%pk;i++) if(i%pi) ans=ans*i%pk; return ans*mul(n/pi,pi,pk)%pk; } ll C(ll n,ll m,ll pi,ll pk,ll mod){ if(n<m) return 0; ll a=mul(n,pi,pk),b=mul(m,pi,pk),c=mul(n-m,pi,pk); ll ans,k(0); for(ll i=n;i;i/=pi) k+=i/pi; for(ll i=m;i;i/=pi) k-=i/pi; for(ll i=n-m;i;i/=pi) k-=i/pi; ans=a*inv(b,pk)%pk*inv(c,pk)%pk*fpow(pi,k,pk)%pk; return ans*(mod/pk)%mod*inv(mod/pk,pk)%mod; } int main(){ scanf("%I64d%I64d%I64d",&n,&m,&MOD); ll x=MOD; for(ll pk,i=2;i*i<=MOD;i++){ if(!(x%i)){ pk=1; while(!(x%i)) pk*=i,x/=i; ans=(ans+C(n,m,i,pk,MOD))%MOD; } } if(x>1) ans=(ans+C(n,m,x,x,MOD))%MOD; printf("%I64d\n",ans); return 0; }

 


__EOF__

本文作者shenben
本文链接https://www.cnblogs.com/shenben/p/6600629.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   神犇(shenben)  阅读(243)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
点击右上角即可分享
微信分享提示