2016年ACM/ICPC大連賽區 D題(LCM性質+解一元二次方程)
阿新 • • 發佈:2018-11-11
題意:
給你兩個數a,b,讓你拆成x+y=a且lcm(x,y)=b。(x,y都是整數)
跟昨天的有些類似:
令x=ck,y=dk,則b=cdk(k=gcd(x,y))
即可得
ck+dk=a
cdk=b
聯立消去c,d其中一個得到一個一元二次方程組,解一下就行了。
注意 題目中隱含條件:輸出的時候小的在前,大的在後。
程式碼:
#include<bits/stdc++.h> #define ll long long #define inf 0x3f3f3f3f3f3f3f3fLL using namespace std; const int maxn=100010; const ll mo=1e9+7; ll a,b; ll gcd(ll x,ll y){return y==0?x:gcd(y,x%y);} int main() { while(scanf("%lld%lld",&a,&b)!=EOF) { ll k=gcd(a,b); ll dt=a*a-4*k*b; ll c=sqrt(dt); if(dt>=0&&c*c==dt) { ll tmp=(a+c)/(2*k); if((a+c)%(2*k)==0&&b%(tmp*k)==0) { ll cnt=b/(tmp*k); printf("%lld %lld\n",cnt*k,tmp*k); } else { tmp=(a-c)/(2*k); if((a-c)%(2*k)==0&&b%(tmp*k)==0) { ll cnt=b/(tmp*k); printf("%lld %lld\n",cnt*k,tmp*k); } else puts("No Solution"); } } else puts("No Solution"); } return 0; }