两情(数论)

两情

题目描述:
“只愿君心似我心,定不负相思意。”——李之仪
小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;
}

猜你喜欢

转载自blog.csdn.net/soul_mingling/article/details/88088151