Maximum Multiple Sum
题面翻译
题目描述
给定一个整数 n n n,找到一个整数 x x x,这样:
- 2 ≤ x ≤ n 2 \leq x \leq n 2≤x≤n。
- 将 x x x 中小于等于 n n n 的倍数之和取最大值。形式上是 x + 2 x + 3 x + ⋯ + k x x + 2x + 3x + \dots + kx x+2x+3x+⋯+kx,其中 k x ≤ n kx \leq n kx≤n 比 x x x 的所有可能值都大。
输入格式
第一行包含 t t t ( 1 ≤ t ≤ 100 1 \leq t \leq 100 1≤t≤100)——测试用例的数量。
每个测试用例包含一个整数 n n n ( 2 ≤ n ≤ 100 2 \leq n \leq 100 2≤n≤100)。
输出格式
对于每个测试用例,输出一个整数,即 x x x的最优值。可以看出只有一个唯一的答案。
提示说明
对于“ n = 3 n = 3 n=3”,“ x x x”可能取值为“ 2 2 2”和“ 3 3 3”。所有小于等于 n n n的 2 2 2的倍数之和为 2 2 2,所有小于等于 n n n的 3 3 3的倍数之和为 3 3 3。因此, 3 3 3是 x x x的最优值。
对于 n = 15 n = 15 n=15, x x x的最优值为 2 2 2。小于或等于 n n n的所有 2 2 2的倍数之和为 2 + 4 + 6 + 8 + 10 + 12 + 14 = 56 2 + 4 + 6 + 8 + 10 + 12 + 14 = 56 2+4+6+8+10+12+14=56,可以证明它是 x x x的所有其他可能值的最大值。
代码内容
// #include <iostream>
// #include <algorithm>
// #include <cstring>
// #include <stack>//栈
// #include <deque>//队列
// #include <queue>//堆/优先队列
// #include <map>//映射
// #include <unordered_map>//哈希表
// #include <vector>//容器,存数组的数,表数组的长度
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
void solve()
{
ll n,sum=0,op=2;
cin>>n;
for(ll i=2;i<=n;i++)
{
ll k=n/i;
if((k+1)*k/2*i>sum)
{
sum=(k+1)*k/2*i;
op=i;
}
}
cout<<op<<endl;
}
int main()
{
ll t;
cin>>t;
while(t--) solve();
return 0;
}