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 }