根据题意可以得到方程(n-ai)%bi=0;即n≡ai(mod bi)。这就是中国剩余定理的模板。但要注意最后一个点需要快速乘不然会超过范围。
#include<iostream>
#include<cstdio>
using namespace std;
typedef long long ll;
ll a[20],b[20],k,m=1,n,ans;
ll exgcd(ll a,ll b,ll &x,ll &y)
{
if(b==0)
{
x=1,y=0;
return a;
}
ll gcd=exgcd(b,a%b,x,y);
ll t=x;
x=y;
y=t-(a/b)*y;
return gcd;
}
ll f(ll x,ll y,ll mod)
{
ll sum=0;
while(y)
{
if(y%2) sum=(sum+x)%mod;
x=(x+x)%mod;
y/=2;
}
return sum;
}
int main()
{
scanf("%lld",&k);
for(int i=1;i<=k;i++)
scanf("%lld",&a[i]);
for(int i=1;i<=k;i++)
{
scanf("%lld",&b[i]);
m*=b[i];
a[i]=(a[i]%b[i]+b[i])%b[i];
}
for(int i=1;i<=k;i++)
{
n=m/b[i];ll x,y;
exgcd(b[i],n,x,y);
ans=(ans%m+f(f(y,n,m),a[i],m)%m)%m;
}
cout<<(ans+m)%m;
return 0;
}