HDU 5974 GCD数论

A Simple Math Problem

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


Problem Description

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

 

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 8 798 10780
 

 

Sample Output
No Solution 308 490
 
题意:
求一组X,Y使得
X+Y==a
lcm(X,Y)== b
HIn:
 
 

 

所以就解方程。

#include<bits/stdc++.h>
#define LL long long
using namespace std;
LL aa,bb,l;
LL gcd(LL a,LL b){return b==0?a:gcd(b,a%b);}
void solve(LL a,LL b,LL c){
    LL delta=b*b-4*a*c;
    if(delta<0){
        cout<<"No Solution"<<endl;
        return;
    }
    
    delta=sqrt(delta);

    LL i,j;
    i=(-1*b+delta)/2;
    j=-1*b-i;
    
    if(i>j) swap(i,j);
    
    if(i*l+j*l==aa&&i*j*l==bb)
         cout<<i*l<<' '<<j*l<<endl;
    else 
        cout<<"No Solution"<<endl;
}
int main(){
    while(scanf("%lld%lld",&aa,&bb)!=EOF){
        l=gcd(aa,bb);
        solve(1,-1*aa/l,bb/l);
    }
    return 0;
}

 

posted on 2017-07-29 16:21  poler  阅读(163)  评论(0编辑  收藏  举报

导航