链接:
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;
}