CF1656D K-good Solution
做法
奇偶性判定好题。
$Case1:$ $n$ 为奇数
很显然,$n$ 为奇数时一定可以拆分成两个数 $x$ 和 $y$,且 $x$ 为奇数,$y$ 为偶数,发现 $x \mod 2=1,y\mod 2=0$,$k$ 也刚好位 $2$,所以当 $n$ 为奇数时就直接输出 $2$。
$Case2:$ $n$ 为偶数
设 $k$ 个数为 $a_1,a_2,...,a_k$,所以有 $a_1+a_2+..+a_k=n$,由于题目说 $a_1\mod k,a_2 \mod k,...,a_k\mod k$ 互不相同,所以这些数 $\mod k$ 一定为 $0,1,2,...,k-1$ 且不重不漏。
那么考虑拆分 $a_i$,设 $a_i=b_i\times k+c_i(c_i=a_i \mod k)$,那么 $a_1+a_2+...+a_k=n$ 就可以转化为 $(b_1\times k+b_2 \times k+...+b_k\times k)+(c_1+c_2+...+c_k)$。
因为 $c_1+c_2+...+c_k$ 一定等于 $0+1+...+k-1$,等差数列求和得 $\frac{(0+k-1)\times k}{2}=\frac{(k-1)\times k}{2}$,再把 $b_1\times k+b_2\times k+...+b_k\times k$ 提取公因式得 $k\times(b_1+b_2+...+b_k)$,再设 $b_1+b_2+...+b_k=x$,所以 $b_1\times k+b_2\times k+...+b_k\times k=k\times x$。
所以 $n=\frac{(k-1)\times k}{2}+k\times x$,将上式化简得 $2\times n=k\times(k+2\times x-1)$,然后我们发现一个结论:$k$ 和 $k+2\times x-1$ 中一定有一个为偶数,一个为奇数,因为 $2\times x-1$ 一定为奇数,所以如果 $k$ 为偶数,那么 $k+2\times x-1$ 就一定为奇数,上述结论肯定成立,如果 $k$ 为奇数,那么 $k+2\times x-1$ 一定为偶数, 故得证。
所以我们把 $2\times n$ 拆成 $2^{p}+q$,使得 $2^{p}|2\times n-q$,而 $2^{p+1}\nmid 2\times n-q$ 且 $q< 2^{p}$,那么这样做显然 $q$ 为奇数,这样拆是把这个数拆成偶数乘奇数的形式。
设 $a=2^{p},b=q$,那么可以证明 $k$ 一定可以等于 $\min (a,b)$,如果这样拆后 $\min (a,b) \le 1$ 就说明无解(因为题目中说的是 $2\le k$,与题目矛盾),输出 $-1$,否则就输出 $a$ 和 $b$ 中较小的一个(为什么要输出较小的一个?是因为 $k\le2\times x-1+k$,两个数 $a$ 和 $b$ 就相当于 $k$ 和 $2\times x-1+k$,所以较小的一个就为 $k$)。
代码
#include<bits/stdc++.h>
using namespace std;
int T;
long long n;
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%lld",&n);
if(n%2==1)//n为奇数时直接特判
{
printf("2\n");
continue;
}
else//n为偶数
{
long long a=1,b=0,x=2*n;
while(x%2==0)
{
x/=2;a*=2;//将2*n这个数拆分成奇数乘偶数的形式
}
b=(2*n)/a;
if(min(a,b)<2)printf("-1\n");//a、b的最小值小于2,无解
else if(a<b)printf("%lld\n",a);//输出较小的一个数
else if(a>b)printf("%lld\n",b);
}
}
return 0;
}

浙公网安备 33010602011771号