【模板】扩展中国剩余定理

LUOGU_4777_【模板】扩展中国剩余定理(EXCRT)

请添加图片描述
注意加快速乘,防止整数溢出。

#include<bits/stdc++.h> #define ll long long using namespace std; const int mx=1e5+5; int n; ll a[mx],m[mx]; ll fmul(ll x,ll y,ll z) { x%=z,y%=z; if(y<0) x=-x,y=-y; ll sum(0); for(;y;y>>=1) { if(y&1) sum=(sum+x)%z; x=(x+x)%z; } return sum; } ll fpow(ll x,ll y,ll z) { x%=z; ll mul(1); for(;y;y>>=1) { if(y&1) mul=mul*x%z; x=x*x%z; } return mul; } void exgcd(ll &x,ll &y,ll a,ll b,ll &d) { if(b==0) { x=1,y=0,d=a; } else { exgcd(y,x,b,a%b,d); y-=x*(a/b); } } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%lld%lld",&m[i],&a[i]); } bool flg(0); for(int i=2;i<=n;i++) { ll tmp=((a[i]-a[1])%m[i]+m[i])%m[i]; ll k1,k2,d; exgcd(k1,k2,m[1],m[i],d); if(tmp%d) { flg=1;break; } k1=(fmul(k1,tmp/d,m[i]/d)+(m[i]/d))%(m[i]/d); ll M=m[1]/d*m[i]; a[1]=(a[1]+fmul(m[1],k1,M))%M; m[1]=M; } printf("%lld",a[1]); }

中国剩余定理:
M = ∏ i = 1 n m i M=\prod_{i=1}^nm_i M=i=1nmi M i = M m i M_i=\frac{M}{m_i} Mi=miM ,则 a n s = ∑ i = 1 n M i M i − 1 a i ans=\sum_{i=1}^nM_iM_i^{-1}a_i ans=i=1nMiMi1ai 是模 M M M 意义下原同余方程组的解。其中 M i − 1 M_i^{-1} Mi1 是模 m i m_i mi 意义下的逆元。

#include<bits/stdc++.h> #define ll long long using namespace std; const int mx=1005; int n; ll M,res,a[mx],m[mx]; ll fpow(ll x,ll y,ll z) { x%=z; ll mul(1); for(;y;y>>=1) { if(y&1) mul=mul*x%z; x=x*x%z; } return mul; } void exgcd(ll &x,ll &y,ll a,ll b) { if(b==0) { x=1,y=0; } else { exgcd(y,x,b,a%b); y-=x*(a/b); } } int main() { scanf("%d",&n); M=1; for(int i=1;i<=n;i++) { scanf("%lld%lld",&m[i],&a[i]); M=M*m[i]; } for(int i=1;i<=n;i++) { ll mi=M/m[i],x,y; exgcd(x,y,mi,m[i]); x=(x%m[i]+m[i])%m[i]; res=(res+a[i]*mi*x%M)%M; } printf("%lld",res); }

__EOF__

本文作者仰望星空的蚂蚁
本文链接https://www.cnblogs.com/cqbzly/p/17530269.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   仰望星空的蚂蚁  阅读(7)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
点击右上角即可分享
微信分享提示