数论总是烧脑的,但模板题总是能切的
学这个的时候先得弄懂欧几里得求gcd的算法,那个递归的挺好理解的(不过推荐改成非递归的,虽然这道题并不要用)
然后就学扩展欧几里得算法,想明白了就好,依然是求gcd,只是会记录一下过程(x,y),这篇博客很不错(推荐) http://blog.csdn.net/zhjchengfeng5/article/details/7786595
然后再学中国剩余定理,前前后后花了几个小时,果然智商是硬伤
代码
#include<iostream>
using namespace std;
#define ll long long
ll m[13],p[13];
int N;
int e_gcd(ll a,ll b,ll &x,ll &y)
{
if(!b)
{
x=1;y=0;
return a;
}
int ans=e_gcd(b,a%b,x,y);
int temp=x;
x=y;
y=temp-(a/b)*y;
return ans;
}
ll f()
{
ll M=1,y,x=0;
for(int i=0;i<N;i++) M*=p[i];
for(int i=0;i<N;i++)
{
ll w=M/p[i];
ll tx=0;
int t=e_gcd(p[i],w,tx,y);
x=(x+y*w*(m[i]/t))%M;
}
return (x+M)%M;
}
int main()
{
while(cin>>N)
{
for(int i=0;i<N;i++)
cin>>p[i]>>m[i];
cout<<f()<<endl;
}
return 0;
}