题意:
给你一个n(2<=n<= 109),让你寻找满这样的a和b:n=a+b且lcm(a,b)最大。输出最大的lcm(a,b)。
思路:
由最小公倍数最大可知,a和b应尽量接近。
当n=2*k+1时,易知a=k,b=k+1,因相邻的两个整数必定互质,它们的最小公倍数肯定最大
当n=2*k时,显然不能让a=k,b=k,此时最小公倍数就是k了。若k为偶数,令a=k-1,b=k+1,因相邻的奇数互质。若k为奇数,令a=k-2,b=k+2。
注意n=2的情况要特殊处理一下
#include<iostream>
using namespace std;
inline long long gcd(long long a, long long b)
{
return b?gcd(b,a%b):a;
}
inline long long lcm(long long a, long long b)
{
return a*b/gcd(a,b);
}
int main()
{
long long T,n,k,ans;
cin>>T;
while(T--)
{
cin>>n;
if(n==2)
{
cout<<1<<endl;
continue;
}
k=n/2;
if(n==2*k)
{
if(k%2==1)
{
ans=lcm(k-2,k+2);
}
else if(k%2==0)
{
ans=lcm(k-1,k+1);
}
}
else if(n==2*k+1)
{
ans=lcm(k,k+1);
}
cout<<ans<<endl;
}
return 0;
}