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
要我们求解xy使得
x+y=a x + y = a
lcm(x,y)=b l c m ( x , y ) = b
如果能找到一组解输出x y,否则输出“No Solution”
首先我们对二式变一下型
lcm(x,y)=b l c m ( x , y ) = b
↓ ↓
x⋅ygcd(x,y)=b x ⋅ y g c d ( x , y ) = b
↓ ↓
x⋅y=b⋅gcd(x,y) x ⋅ y = b ⋅ g c d ( x , y )
x+y=a x + y = a
↓ ↓
x⋅(a−x)=b⋅gcd(x,y) x ⋅ ( a − x ) = b ⋅ g c d ( x , y )
↓ ↓
x2−ax+b⋅gcd(x,y)=0 x 2 − a x + b ⋅ g c d ( x , y ) = 0
所以题目转化成了求解这个二次方程,看似一元二次方程
但是其中还有一个大问题就是 gcd(x,y) g c d ( x , y ) 怎么求?或者说我们可以怎么表示 gcd(x,y) g c d ( x , y )
设 g=gcd(x,y) g = g c d ( x , y )
则:
x=k1⋅g x = k 1 ⋅ g
y=k2⋅g y = k 2 ⋅ g
因为g是x,y的最大公因数那么 k1,k2 k 1 , k 2 一定是互质的数
我们代回最初的方程组中得到
↓ ↓
因为 k1,k2 k 1 , k 2 是互质的,那么 k1+k2,k1⋅k2 k 1 + k 2 , k 1 ⋅ k 2 是互质的
p,q p , q 是互质的两个整数
M=p+q,N=pq M = p + q , N = p q
假设M,N不是互质的
那么必有 M=aN M = a N 或 N=aM N = a M a为整数
我们以 M=aN M = a N 为例,则原式等于 p+q=apq p + q = a p q
p=q(ap−1) p = q ( a p − 1 )
pq=ap−1 p q = a p − 1
因为p,q互质所以 pq p q 一定不会得到整数
但是a是整数,p是整数,则ap-1是整数
所以等式两边相矛盾故:
若p,q是互质的,那么p+q和pq也是互质的
那么有了这个结论说明 ag a g 和 bg b g 是互质的,那么g就是a,b的最大公因数
也就是 gcd(a,b)=gcd(x,y) g c d ( a , b ) = g c d ( x , y )
所以该题目转变成
求解一元二次方程 x2−ax+b⋅gcd(a,b)=0 x 2 − a x + b ⋅ g c d ( a , b ) = 0
code:
#include
#include
#include
using namespace std;
int gcd(int a,int b){
return b ? gcd(b,a%b) : a;
}
int a,b;
int main(){
while(scanf("%d%d",&a,&b) != EOF){
int diat = a * a - 4 * b * gcd(a,b);
if(diat < 0){
printf("No Solution\n");
}
else{
int p = (int)sqrt(1.0*diat);
if(p * p != diat){
printf("No Solution\n");
}
else{
int x1 = (a + p) / 2;
int x2 = (a - p) / 2;
int x = min(x1,x2);
printf("%d %d\n",x,a-x);
}
}
}
return 0;
}