Description
x+y=a,lcm(x,y)=b;已知a和b求解 x^2+y^2
Input
多组数据输入。 第一行一个t表示a,b数对的数量。 接下来t行2个数表示a,b T<=100000 a,b<10^9;
Output
每组样例输出t行每行一个数表示\(\)x^2+y^2[\latex];
分析
这个题比较巧妙,从数据范围来看显然不能够遍历计算出x,y后输出
进行一些数学运算后不难发现
$$a^2=x^2+y^2+2*x*y$$
$$x*y=gcd(x,y)*lcm(x,y)=gcd(x,y)*b$$
至此,也即我们需要化简gcd(x,y),找出其与a,b之间的关系
不妨设$$m=gcd(x,y)$$则$$x=m*k1,y=m*k2$$
则得$$a=x+y=m*(k1+k2)$$ $$b=\frac{x*y}{gcd(x,y)}=\frac{x*y}{m}=k1*k2*m$$
自然$$gcd(a,b)=gcd( m*(k1+k2), k1*k2*m)=m*gcd(k1+k2,k1*k2)$$
又因为k1与k2互质故可得 $$gcd(a,b)=m=gcd(x,y)$$
Accepted Code
#include <bits/stdc++.h>
using namespace std;
long long rem;
long long gcd(long long a, long long b)
{
if (a < b)
{
swap(a, b);
}
rem=0;
while (b > 0)
{
rem = a % b;
a = b;
b = rem;
}
return a;
}
int main()
{
int t;
while (cin >> t)
{
while (t--)
{
long long a, b;
scanf("%lld %lld",&a,&b);
long long tmp=gcd(a,b);
printf("%lld\n",a * a - 2 * b * tmp);
}
}
return 0;
}
解后反思
数学还是重要啊

