【luogu4777】扩展中国剩余定理(EXCRT)[数论 扩展中国剩余定理]

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

我的扩中终于出生了!!!!!!

历经磨难

开始没看题 这个题居然是求 x ≡ b (mod a) 啊啊啊啊啊啊就一直输出无解

然后又把判断无解的 if(c%gcd) return -1; 打成了if(!c%gcd) return -1; 而且还有几个地方忘了开long long

都这样了我都还有6昏 tql具体是酱紫:

就是用扩欧求解

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=1e5+5;
 4 #define ll long long
 5 ll n,ai[N],bi[N];
 6 template<class t>void rd(t &x)
 7 {
 8     x=0;int w=0;char ch=0;
 9     while(!isdigit(ch)) w|=ch=='-',ch=getchar();
10     while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
11     x=w?-x:x;
12 }
13 
14 ll exgcd(ll a,ll b,ll &x,ll &y)
15 {
16     if(!b) {x=1,y=0;return a;}
17     ll gcd=exgcd(b,a%b,x,y);
18     ll t=x;x=y,y=t-a/b*y;
19     return gcd;
20 }
21 
22 ll mul(ll a,ll b,ll mod)
23 {
24     ll ans=0;
25     while(b)
26     {
27         if(b&1) ans=(ans+a)%mod;
28         a=(a+a)%mod,b>>=1;
29     }
30     return ans;
31 }
32 
33 ll excrt()
34 {
35     ll x,y;
36     ll M=bi[1],ans=ai[1];//第一个方程的解
37     for(int i=2;i<=n;i++)
38     {
39         ll a=M,b=bi[i],c=(ai[i]-ans%b+b)%b;
40         ll gcd=exgcd(a,b,x,y),bg=b/gcd;
41         //求方程 t*M mod bi =ai-x 的解t
42         if(c%gcd) return -1;
43         x=mul(x,c/gcd,bg);
44         ans+=x*M,M*=bg,ans=(ans%M+M)%M;
45      }
46      return (ans%M+M)%M;
47 }
48 
49 int main()
50 {
51     rd(n);
52     for(int i=1;i<=n;i++) rd(bi[i]),rd(ai[i]);
53     printf("%lld",excrt());
54     return 0;
55 }

 

posted @ 2019-03-16 16:17  委屈的咸鱼鱼鱼鱼  阅读(259)  评论(0编辑  收藏  举报