AcWing 204. 表达整数的奇怪方式

原题链接

考察:扩展中国剩余定理

关于本题的exgcd(a1,-a2)与exgcd(a1,a2).得到的解和最小公倍数不同.但得到的解*(m2-m1)/gcd(a1,a2)最后结果又会化为相同.

如果用exgcd(a1,-a2),下面求a1就需要将他fabs,求解需要a1来得到最小正整数解.

个人理解:如果a1是正数就一定能得到最小正整数解,否则不一定

 1 #include <iostream>
 2 #include <algorithm>
 3 using namespace std;
 4 typedef long long ll;
 5 ll exgcd(ll a,ll b,ll& x,ll& y)
 6 {
 7    if(!b)
 8    {
 9        x = 1,y = 0;
10        return a;
11    }
12    ll d = exgcd(b,a%b,y,x);
13    y-=a/b*x;
14    return d;
15 }
16 int main()
17 {
18     int n; scanf("%d",&n);
19     ll a1,m1;
20     bool ok = 1;
21     scanf("%lld%lld",&a1,&m1);
22     for(int i=1;i<=n-1;i++)
23     {
24         ll a2,m2,y1,y2; scanf("%lld%lld",&a2,&m2);
25         ll d = exgcd(a1,a2,y1,y2);
26         if((m2-m1)%d)
27         {
28             ok = 0; break;
29         }
30         y1 = y1*(m2-m1)/d;
31         y1 = (y1%(a2/d)+a2/d)%(a2/d);
32         m1 = a1*y1+m1;
33         a1 = a1/d*a2;
34     }
35     if(!ok) puts("-1");
36     else printf("%lld",(m1%a1+a1)%a1);
37     return 0;
38 }

 

posted @ 2021-01-27 21:31  acmloser  阅读(84)  评论(0编辑  收藏  举报