题解 P5436 【【XR-2】缘分】
Alex_Cui
·
·
题解
是挺有缘分的, 我一开始的想法是枚举然后算最大, 然后发现没这么复杂...
首先在 n 个数当中, 找到乘积最大的, 那必定是 n\times(n-1), 然后我们就想这会不会是某两个数的最小公倍数.
根据最小公倍数的定义, 对于两个正整数 p,q, 则 lcm(p,q)=\frac{p\times q}{gcd(p,q)}. 要使得这个等式的值最大, 即令 p\times q 最大, gcd(p,q) 最小. 根据最大公因数的定义, 当 p,q 互素时, gcd(p,q)=1, 此时 gcd(p,q) 的值最小, 使得 lcm(p,q)=p\times q.
且我们知道, 两个正整数 p,q 互素, 即两数没有除了 1 以外的公因数. 那对于 n, n-1 来说, 假设他们有一个不为 1 的公因数 a, 我们可以得到 a|n, a|n-1 ( | 是整除符号, a|b 表示 b 除以 a 的商是一个整数), 如果 a|n, 那么可以得到 a|n-ma (m为大于1的整数), 由 a|n-1 可知, a=1, 与条件不符. 可证正整数 n, n-1 没有除 1 外的公因数, 两数互素, lcm(n,n-1)=n\times(n-1)
因此在不大于 n 的正整数两两组合中, 最大的 lcm(n,n-1)=n\times(n-1)
Update 2024/11/21:
原解析未判断边界条件(我也不知道为什么,可能当时脑子坏掉了吧,整理以前的东西的时候发现的)
需要特判 n=1 时,不难看出此时使得最小公倍数最大的方案是两边都选 1,因此直接特判即可。
#include <iostream>
using namespace std;
int main() {
unsigned long long t, n;
cin >> t;
while (t--) {
cin >> n;
if (n == 1)
cout << 1 << endl;
else
cout << n * (n - 1) << endl;
}
return 0;
}