题意:
给定a,ba,ba,b,找出x,yx,yx,y,使得
x+y=alcm(x,y)=b
x+y=a\\
lcm(x,y)=b
x+y=alcm(x,y)=b
Solution:
似乎有lcmlcmlcm,要么跟唯一分解有关系,要么跟gcdgcdgcd有关系,唯一分解可以枚举分配因子的幂,但是有120000120000120000组样例,时间复杂度不够。
对于gcd(x,y)gcd(x,y)gcd(x,y),设k1,k2k_{1},k_{2}k1,k2满足
gcd(x,y)⋅k1=xgcd(x,y)⋅k2=y
gcd(x,y)\cdot k_{1}=x\\
gcd(x,y)\cdot k_{2}=y
gcd(x,y)⋅k1=xgcd(x,y)⋅k2=y
那么
x+y=gcd(x,y)⋅(k1+k2)=a(1)
x+y=gcd(x,y)\cdot(k_{1}+k_{2})=a \tag{1}
x+y=gcd(x,y)⋅(k1+k2)=a(1)
xy=gcd(x,y)2⋅k1k2(2) xy=gcd(x,y)^2\cdot k_{1}k_{2} \tag{2} xy=gcd(x,y)2⋅k1k2(2)
由(2)(2)(2)
lcm(x,y)=xygcd(x,y)=gcd(x,y)⋅k1k2=b(3)
lcm(x,y)=\frac{xy}{gcd(x,y)}=gcd(x,y)\cdot k_{1}k_{2}=b \tag{3}
lcm(x,y)=gcd(x,y)xy=gcd(x,y)⋅k1k2=b(3)
由(1)(3)(1)(3)(1)(3)
k1+k2=agcd(x,y)k1k2=bgcd(x,y)(4)
k_{1}+k_{2}=\frac{a}{gcd(x,y)}\\ \tag{4}
k_{1}k_{2}=\frac{b}{gcd(x,y)}
k1+k2=gcd(x,y)ak1k2=gcd(x,y)b(4)
因为k1,k2k1,k2k1,k2是除了gcd(x,y)gcd(x,y)gcd(x,y)之外的因子,于是k1,k2k1,k2k1,k2一定没有重复因子,于是gcd(k1,k2)=1gcd(k_{1},k_{2})=1gcd(k1,k2)=1
存在一个结论
若x,yx,yx,y互质,那么x+yx+yx+y与xyxyxy互质,证明如下
由辗转相除gcd(a,b)=gcd(b,a%b)gcd(a,b)=gcd(b,a\%b)gcd(a,b)=gcd(b,a%b)
gcd(x,y)=gcd(x+y,x)=1 gcd(x,y)=gcd(x+y,x)=1 gcd(x,y)=gcd(x+y,x)=1
即x+y,xx+y,xx+y,x互质,同理对gcd(y,x)gcd(y,x)gcd(y,x)操作,可以得到x+y,yx+y,yx+y,y互质那么(x+y)2,xy(x+y)^2,xy(x+y)2,xy一定互质,因为每个因子都不会重复,又x+yx+yx+y已经包含了(x+y)2(x+y)^2(x+y)2的所有素因子了,于是得到x+y,xyx+y,xyx+y,xy互质
利用这个结论,我们可以得到
gcd(agcd(x,y),bgcd(x,y))=1
gcd(\frac{a}{gcd(x,y)},\frac{b}{gcd(x,y)})=1
gcd(gcd(x,y)a,gcd(x,y)b)=1
于是
gcd(a,b)=gcd(x,y)
gcd(a,b)=gcd(x,y)
gcd(a,b)=gcd(x,y)
这样就可以得到gcd(x,y)gcd(x,y)gcd(x,y)的值,代入方程组(4)(4)(4)得到一个二元一次方程,就可以解出k1,k2k_{1},k_{2}k1,k2,从而得到x,yx,yx,y,注意解出来的k1,k2k_{1},k_{2}k1,k2要是正整数
// #include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
using ll=long long;
const int N=1e5+5,inf=0x3fffffff;
const long long INF=0x3fffffffffffffff,mod=998244353;
pair<ll,ll> solve(ll a,ll b)
{
//解方程组xy=a,x+y=b
pair<ll,ll>ret={-1,-1};
if(b*b<4*a) return ret;
double y=(b+sqrt(b*b-4*a))/2;
if(fabs(y-floor(y))>1e-8) return ret;
return make_pair(b-y,y);
}
ll a,b;
int main()
{
ios::sync_with_stdio(false);
while(cin>>a>>b)
{
ll gcd=__gcd(a,b);
auto tmp=solve(b/gcd,a/gcd);
if(tmp.first==-1) printf("No Solution\n");
else printf("%lld %lld\n",tmp.first*gcd,tmp.second*gcd);
}
return 0;
}
1万+



被折叠的 条评论
为什么被折叠?



