1. 程式人生 > 其它 >HDU 5974 - A Simple Math Problem (數論)

HDU 5974 - A Simple Math Problem (數論)

技術標籤:數學

連結:
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; }