POJ 2891

中国剩余定理的扩展

View Code
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<vector>
 4 using namespace std;
 5 typedef long long int ll;
 6 ll exgcd(ll a, ll b, ll &x, ll &y)
 7 {
 8     if (b == 0) {
 9         x = 1;
10         y = 1;
11         return a;
12     }
13     ll d = exgcd(b,a%b,x,y);
14     ll t = x;
15     x = y;
16     y = t - a/b*y;
17     return d;
18 }
19 
20 ll get_res(vector<ll> &a, vector<ll> &r)
21 {
22     ll A(a[0]),R(r[0]),x,y,d;
23     for (int i(1); i<a.size(); ++i) {
24         d = exgcd(A,a[i],x,y);
25         ll c = r[i] - R;
26         if (c%d)return -1;
27         ll a1 = abs(a[i]/d);
28         x = x*c/d;
29         x = (x%a1 + a1)%a1;
30         R += A*x;
31         A *= a[i]/d;
32     }
33     return R;
34 }
35 
36 
37 int main()
38 {
39     int n;
40     while (scanf("%d",&n) != EOF) {
41         vector<ll> a;
42         vector<ll> r;
43         ll aa,rr;
44         for (int i(0); i<n; ++i) {
45             scanf("%I64d%I64d",&aa,&rr);
46             a.push_back(aa);
47             r.push_back(rr);
48         }
49         ll R = get_res(a,r);
50         cout<<R<<endl;
51     }
52 }
posted on 2012-08-20 20:30  Dev-T  阅读(192)  评论(0编辑  收藏  举报