我的扩中终于出生了!!!!!!
历经磨难
开始没看题 这个题居然是求 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 }