#include <iostream>
#include <algorithm>
typedef long long ll;
using namespace std;
ll exgcd(ll a,ll b,ll &x,ll &y)//拓展欧几里得(辗转相除法,用于求最大公约数)
{
if(b==0)
{
x=1;
y=0;
return a;
}
ll t=exgcd(b,a%b,y,x);//注意是y,x
y=y-a/b*x;
return t;
}
ll china(ll a[],ll b[])//中国剩余定理
{
ll m=1,ans=0,mx=-1;
for(int i=0;i<8;i++)
{
m*=a[i];
mx=max(mx,a[i]);//记录最大的除数
}
for(int i=0;i<8;i++)
{
ll x,y;
ll w=m/a[i];
ll t=exgcd(w,a[i],x,y);
ans=(ans+w*b[i]*(x/t))%m;//当w和a[i]互质时,t=gcd(w,a[i])=1
}
while(ans<mx)ans+=m;//当结果小于最大的除数,不断加m
return ans;
}
int main()
{
ll a[8],b[8],ans;
for(int i=0;i<8;i++)cin>>a[i];//存储除数
for(int i=0;i<8;i++)cin>>b[i];//存储余数
cout<<china(a,b)<<endl;
return 0;
}
韩信点兵(scau)
最新推荐文章于 2022-01-09 21:27:26 发布