CodeTON Round 1 D K-good 题解

190 阅读1分钟

题目链接

思路

因为不能有00,设这kk个数分别为1+a1k,2+a2k,,k+ank1+a_1k,2+a_2k,\cdots,k+a_nk,设m=i=1kaim=\sum\limits_{i=1}^{k}a_i,这些数加起来就是(k+1)k2+mk\frac{(k+1)k}{2}+mk。也就是要找一个kk满足n(k+1)k2(modk)n\equiv\frac{(k+1)k}{2}\pmod k

如果nn为奇数,显然k=2k=2满足题意。

现在考虑nn为偶数的情况。

如果kk为偶数,原式可写作nk2(modk)n\equiv\frac{k}{2}\pmod k,那么kk要满足kk不是nn的因数,但是kk2n2n的因数。除此之外因为还要满足n(k+1)k2n\geq\frac{(k+1)k}{2},所以要想办法让kk最小。设小于等于kk的最大的22的幂为2g2^g,那么k=2g+1k=2^{g+1}就是最小的答案。

如果kk为奇数,原式就变成n0(modk)n\equiv0\pmod k,只需要kknn的因数即可,设k1=2g+1,k2=2nk1k_1=2^{g+1},k_2=\frac{2n}{k_1},如果k1k_1不满足题意,有(k1+1)k1>2nk2<k1+1(k_1+1)k_1>2n\Rightarrow k_2<k_1+1,因为k2k_2为奇数,k1k_1为偶数,有k2k11k_2\leq k_1-1,因此(k2+1)k2k1k2=2n(k_2+1)k_2\leq k_1k_2=2n(k2+1)k222n\frac{(k_2+1)k_2}{2}\leq2n,因此k2k_2必然满足题意。

另外22的幂没有答案,特判一下就可以。

代码

#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;
    }
}