题目链接
思路
因为不能有0,设这k个数分别为1+a1k,2+a2k,⋯,k+ank,设m=i=1∑kai,这些数加起来就是2(k+1)k+mk。也就是要找一个k满足n≡2(k+1)k(modk)。
如果n为奇数,显然k=2满足题意。
现在考虑n为偶数的情况。
如果k为偶数,原式可写作n≡2k(modk),那么k要满足k不是n的因数,但是k是2n的因数。除此之外因为还要满足n≥2(k+1)k,所以要想办法让k最小。设小于等于k的最大的2的幂为2g,那么k=2g+1就是最小的答案。
如果k为奇数,原式就变成n≡0(modk),只需要k是n的因数即可,设k1=2g+1,k2=k12n,如果k1不满足题意,有(k1+1)k1>2n⇒k2<k1+1,因为k2为奇数,k1为偶数,有k2≤k1−1,因此(k2+1)k2≤k1k2=2n,2(k2+1)k2≤2n,因此k2必然满足题意。
另外2的幂没有答案,特判一下就可以。
代码
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
typedef long long ll;
int main()
{
int T;
cin >> T;
while(T--)
{
ll n;
cin >> n;
ll x = n;
while(x % 2 == 0)
x /= 2;
if(x == 1)
cout << -1 << endl;
else if(x <= 2e9 && (x*(x+1))/2 <= n)
cout << x << endl;
else
cout << 2*(n/x) << endl;
}
}