https://www.luogu.com.cn/problem/P3868
思路:
C
R
T
CRT
CRT模板题啊。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=15;
int n;
ll a[maxn],m[maxn];
ll qmul(ll a,ll b,ll p)
{
ll ans=0;
while(b)
{
if(b&1)
ans=(ans+a)%p;
a<<=1;
a%=p;
b>>=1;
}
return ans;
}
ll fmul(ll a,ll b,ll p)
{
return (a*b-(ll)((long double)a*b/p)*p+p)%p;
}
ll exgcd(ll a,ll b,ll &x,ll &y)
{
if(b==0)
{
x=1,y=0;
return a;
}
ll c=exgcd(b,a%b,x,y);
ll t=x;
x=y;
y=t-a/b*y;
return c;
}
ll inv(ll a,ll p)// 求 a%p 的乘法逆元
{
ll x,y;
exgcd(a,p,x,y);
return (x%p+p)%p;
}
ll RCT()
{
ll ans=0,M=1;
for(int i=1;i<=n;i++)
M*=m[i];
for(int i=1;i<=n;i++)
{
ll tmp=M/m[i];
ans=(ans+fmul(fmul(a[i],tmp,M),inv(tmp,m[i]),M))%M;
}
return (ans+M)%M;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]);
for(int i=1;i<=n;i++)
{
scanf("%lld",&m[i]);
a[i]=(a[i]%m[i]+m[i])%m[i];
}
printf("%lld\n",RCT());
return 0;
}