hdu5974————A Simple Math Problem(GCD)

来源:互联网 发布:mac os 进去读条 黑屏 编辑:程序博客网 时间:2024/04/28 12:08

A Simple Math Problem

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 2382    Accepted Submission(s): 746


Problem Description
Given two positive integers a and b,find suitable X and Y to meet the conditions:
Least Common Multiple (X, Y) =b
X+Y=a
 

Input
Input includes multiple sets of test data.Each test data occupies one line,including two positive integers a(1≤a≤2*10^4),b(1≤b≤10^9),and their meanings are shown in the description.Contains most of the 12W test cases.
 

Output
For each set of input data,output a line of two integers,representing X, Y.If you cannot find such X and Y,output one line of "No Solution"(without quotation).
 

Sample Input
6 8798 10780
 

Sample Output
No Solution308 490

思路:

设有两个数 x 和 y 

因为gcd(x,y)=g   x=k1*g  y=k2*g

所以易得 k1 和 k2 互质

由题意

g*k1*k2=b;

g*(k1+k2)=a;

所以   k1*k2=b/g

          k1+k2=a/g

因为  k1 和 k2 互质

所以  k1*k2  和 k1+k2 互质

所以  a和b 互质

所以 gcd(x,y)=gcd(a,b);

接下来就用  初中学的解一元二次方程  和他的性质:x1+x2=-b/a     x1x2=c/a  来求解


#include<iostream>#include<cmath>#include<cstring>#include<vector>#include<stdlib.h>#include<stdio.h>#include<algorithm>#include <set>#include <list>#include <deque>#include<map>#include<sstream>#include<time.h>#define pi  3.1415926#define N 2005#define M 15#define INF 0x3f3f3f3f#define lson l , m , rt << 1#define rson m + 1 , r , rt << 1 | 1using namespace std;typedef long long ll;const int maxn = 1000000 + 5;const int day =21252;ll gcd(ll a,ll b){    if(b==0)        return a;    else return gcd(b,a%b);}int main(){    ll a,b;    while((scanf("%lld %lld",&a,&b))!=EOF)    {        ll q=gcd(a,b);        a=a/q;        b=b/q;        if(a*a-4*b<0)        {            printf("No Solution\n");            continue;        }        ll d=a*a-4*b;       ll c=sqrt(d);        if(c*c!=d)        {            printf("No Solution\n");            continue;        }        if((a+c)%2!=0||(a-c)%2!=0)        {            printf("No Solution\n");            continue;        }        ll x1=(a+c)/2;        ll x2=(a-c)/2;        printf("%lld %lld\n",x2*q,x1*q);    }    return 0;}