和为n的俩个数的最大lcm

“只愿君心似我心,定不负相思意”——李之仪 
小 W 将要去和小 K 约会啦!
但聪(ao)明(jiao)的小 K 并不想让小 W 那么容易知道他们的约会地点。于是小 W 收到了一条信息:“给定两个数的和 nn, 请你求出这两个数的最小公倍数的可能值的最大值,作为交换,如果你给出了正确答案,我将会把你和小 K 的约会地点告诉你。”
众所周知,小 W 是个数学弱渣,他只好求助数学巨佬小 H,但小 H 并不屑于做这种简单题,于是帮助小 W 的任务就交给你啦! 

Input

输入文件的第一行一个整数 TT 表示数据组数。
接下来 TT 行每行一个整数 nn ,表示给定的两个数的和 nn,数据保证nn>0。

Output

TT 行,每行一个整数表示和为 nn 的两个数的最小公倍数的可能值的最大值。

Samples

Input Copy
3
2
3
4
Output
1
2
3

Hint

  • 30%的数据满足 T10T≤10, 1<n10001<n≤1000
  • 100% 的数据满足 T10000T≤10000 ,1<n1091<n≤109

Source

石光中学 2018年 泉州复赛模拟 提高组 day1

 

 

 

 

若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

 

 

#pragma GCC optimize(2)
#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
typedef long long ll;
int read(){
    int x=0; int f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9') {if(ch=='-') f=-1; ch=getchar();}
    while(ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar();}
    return x*f;
}
const int maxn=2e6+100;
/*
若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
*/ 
int main(){
    int t;
    cin>>t;
    while(t--){
        ll n;
        cin>>n;
        if(n==2){
            cout<<1<<endl;
        }
        else if(n&1){
            ll p=n/2;
            ll p1=p+1;
            ll ans=p*p1/__gcd(p,p1);
            cout<<ans<<endl;
        }
        else{
            ll p=n/2;
            ll p1,p2,ans;
            if(p%2==0){
                p1=p-1;
                p2=p+1;
            }
            else{
                p1=p-2;
                p2=p+2;
            }
            ans=p1/__gcd(p1,p2)*p2;
            cout<<ans<<endl;
        }
    } 
} 

 

posted @ 2021-02-18 00:18  lipu123  阅读(43)  评论(0)    收藏  举报