两情
题目描述:
“只愿君心似我心,定不负相思意。”——李之仪
小W将要去和小K约会啦!
但聪(ao)明(jiao)的小K并不想让小W那么容易知道他们的约会地点。于是小W收到了一条信息:
给定两个数的和n,请你求出这两个数的最小公倍数的可能值的最大值
作为交换,如果你给出了正确答案,我将会把你和小K的约会地点告诉你。”
众所周知,小W是个数学弱渣,他只好求助数学巨佬小H,但小H并不屑于做这种简单题,于是帮助小W的任务就交给你啦!
输入:输入的第一行一个整数T表示数据组数。
接下来T行每行一个整数n,表示给定的两个数的和n。
输出:共T行,每行一个整数表示和为n的两个数的最小公倍数的可能值的最大值。
样例输入:
3
2
3
4
样例输出:
1
2
3
标准官方思路(说是很简单,但鬼才能想到啊啊啊啊啊)
若n为奇数,则a和b相差 1 最优
若n为偶数,令m = n/2,若m - 1和m + 1均为奇数,则a = m - 1, b = m + 1
否则a = m - 2, b = m + 2
特别的,n为2时,输出1
(不要想枚举,妥妥的TL)
#include <bits/stdc++.h>
using namespace std;
long long gcd(long long x, long long y)//最大公约数
{
if(y==0)
return x;
else
return gcd(y, x%y);
}
long long lcm(long long x,long long y)//最小公倍数
{
if(x>y) return x*y/gcd(x,y);
else return x*y/gcd(y,x);
}
int main()
{
long long n,v,a,b;
scanf("%lld",&n);
while(n--)
{
long long u;
scanf("%lld",&u);
if(u==2) v=1;//特殊情况
else if(u%2!=0)
{
a=u/2;
b=a+1;
v=lcm(a,b);
}
else
{
long long m=u/2;
if(m%2==0)
{
a=m-1;
b=m+1;
}
else
{
a=m-2;
b=m+2;
}
v=lcm(a,b);
}
printf("%lld\n",v);
}
return 0;
}