(已修改)
gcd=1肯定是最差选择因为任何一个gcd大于1的值都要比gcd1的选择要优(gcd=1的最优也就是2*x-1),那么可以枚举x的所有因数,找到该最大因数的倍数小于x的情况,取所有情况的最大值即可
#include <bits/stdc++.h>
using namespace std;
#define int long long
int get(int x,int y){
	int d=(y-1)/x;
	return (x*d+y)*(x);
}
signed main() {
	int t;
	cin>>t;
	while(t--){
		int x;
		cin>>x;
		int ans=2*x-1;
		for(int i=2;i*i<=x;i++){
			if(x%i==0){
				ans=max(ans,get(i,x));
				int y=x/i;
				ans=max(ans,get(y,x));
			}
		}
		cout<<ans<<'\n';
	}
	return 0;
}
def get(x, y):
    d = (y - 1) // x
    return (x * d + y) * x
# 读取测试次数
t = int(input())
for _ in range(t):
    x = int(input())
    ans = 2 * x - 1
    i = 2
    while i * i <= x:
        if x % i == 0:
            ans = max(ans, get(i, x))
            y = x // i
            ans = max(ans, get(y, x))
        i += 1
    print(ans)
import java.util.Scanner;
public class Main {
    // 计算get函数
    static long get(long x, long y) {
        long d = (y - 1) / x;
        return (x * d + y) * x;
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int t = sc.nextInt();  // 读取测试次数
        while (t-- > 0) {
            long x = sc.nextLong();
            long ans = 2 * x - 1;
            for (long i = 2; i * i <= x; i++) {
                if (x % i == 0) {
                    ans = Math.max(ans, get(i, x));
                    long y = x / i;
                    ans = Math.max(ans, get(y, x));
                }
            }
            System.out.println(ans);
        }
    }
}
        小红有一个正整数x,他希望你找到一个满足1≤y<x的正整数y,使得:(x+y)×gcd(x,y) 的值尽可能大,请你帮他求出这个最大值吧。 gcd(x,y)表示x和y的最大公约数,例如:gcd(4,6)=2。
每个测试文件均包含多组测试数据。第一行输入一个整数T(1≤T≤103)代表数据组数,每组测试数据描述如下:
在一行上输入一个正整数x(2≤x≤109),表示小红询问的x。
对于每组测试数据,输出包含一行一个正整数,表示(x+y)×gcd(x,y)的最大值。
输入
3 
3
6
5
输出
5
27
9