#include"stdio.h" //精度需要注意
#include"iostream"
using namespace std;
typedef long long ll;
int n,m[50],a[50];
void E_gcd(ll a,ll b,ll &d,ll &x,ll &y)
{
if(!b) {d=a;x=1;y=0;}
else{E_gcd(b,a%b,d,y,x);y-=x*(a/b);}
}
ll CRT()
{
ll M=1;
ll ans=0;
int i;
for(i=1;i<=n;i++) //M=m1*m2*m3*...*mn
M=M*m[i];
for(i=1;i<=n;i++) //Mi=M/mi x是Mi的逆元
{
ll d,x,y;
ll Mi=M/m[i];
E_gcd(Mi,m[i],d,x,y);
ans=(ans+a[i]*Mi*x)%M;
}
if(ans<0) ans+=M;
return ans;
}
int main()
{
while(cin>>n)
{
for(int i=1;i<=n;i++)
cin>>m[i]>>a[i];
cout<<CRT()<<endl;
}
return 0;
}
VIJOS 1164 中国剩余定理 CRT
最新推荐文章于 2021-07-17 15:54:22 发布