求多个同余方程公共解
qmul防止乘法爆ll
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll exgcd(ll a,ll b,ll &x,ll &y)
{
if(b==0) {
x=1;
y=0;
return a;
}
ll d=exgcd(b,a%b,x,y);
ll t=x;
x=y,y=t-a/b*y;
return d;
}
ll a[11],b[11];
ll m[11];
ll qmul(ll a,ll b,ll mod)
{
ll ans=0;
while(b>0)
{
if(b&1) ans=(ans+a)%mod;
a=(a+a)%mod;
b>>=1;
}
return ans;
}
int main ()
{
int k;
cin>>k;
for(int i=1;i<=k;++i)
{
cin>>a[i];
}
ll sum=1;
for(int i=1;i<=k;++i)
{
cin>>b[i];
sum*=b[i];
}
for(int i=1;i<=k;++i)
{
a[i]%=b[i];
a[i]=(a[i]+b[i])%b[i];
m[i]=sum/b[i];
}
ll ans=0;
for(int i=1;i<=k;++i)
{
ll x,y;
ll gcdd=exgcd(m[i],b[i],x,y);
x=((x%(b[i]/gcdd))+b[i]/gcdd)%(b[i]/gcdd);
m[i]=m[i]*qmul(a[i],x,b[i]/gcdd);
ans=(ans+m[i])%sum;
}
cout<<((ans%sum)+sum)%sum;
return 0;
}