HDU 5974 - A Simple Math Problem (數論)
阿新 • • 發佈:2021-02-10
技術標籤:數學
連結:
A Simple Math Problem
題意:
給出a(1<=a<=2e4), b(1<=b<=1e9 , 要找到 x , y 使得x + y = a, lcm( x , y) = b.多組輸入(1e5 組)。
思路:
這個資料範圍肯定是不能暴力列舉的,最重要的是知道 gcd(a , b ) = gcd(x , y)。證明可參考 連結
根據一下兩式可以列出一元二次方程 ,求解即可。
xy = lcm(x,y)∗gcd(x,y)=b∗gcd(a,b)
x+y=a
程式碼:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=4e6 + 7;
const int mod = 1e9 + 7;
ll a,b;
ll gcd(ll a,ll b){
if(b == 0) return a;
return gcd(b,a % b);
}
int main (){
while(scanf("%lld%lld",&a,&b)!=EOF){
ll c = b * gcd(a , b);
double p = a * a - 4 * c;
int flag = 1;
if(p < 0) flag = 0;
ll x = (a - sqrt(p)) / 2;
ll y = (a + sqrt(p)) / 2;
if(x * y != gcd(x , y) * b) flag = 0;
if(flag) printf ("%lld %lld\n",x,y);
else printf ("No Solution\n");
}
return 0;
}