传送门 :
题解参考pzr :
将题意转换为
n − k ∗ ( k + 1 ) 2 ≡ 0 m o d k n-\frac{k*(k+1)}{2} \equiv 0\ mod \ k n−2k∗(k+1)≡0 mod k
意为 n − k ∗ ( k + 1 ) 2 是 k 的 倍 数 n-\frac{k*(k+1)}{2} 是 k的倍数 n−2k∗(k+1)是k的倍数 即 n − k ∗ ( k + 1 ) 2 = m ∗ k n-\frac{k*(k+1)}{2} =m*k n−2k∗(k+1)=m∗k
n = m ∗ k + k ∗ ( k + 1 ) 2 n =m*k +\frac{k*(k+1)}{2} n=m∗k+2k∗(k+1) 即 n = k ∗ ( m + ( k + 1 ) 2 ) n=k*(m+\frac{(k+1)}{2}) n=k∗(m+2(k+1))
显然可以看出 , k 是 n 的 因 子 k是n的因子 k是n的因子
这里我们分类讨论一下
我们将 n n n分解为 2 t ∗ s ( s 是 奇 数 ) 2^t*s(s是奇数) 2t∗s(s是奇数)
同时我们还需要使得 n − k ∗ ( k + 1 ) 2 > = 0 n-\frac{k*(k+1)}{2} >=0 n−2k∗(k+1)>=0 因为如果考虑
从 1 + 2 + 3.. + k 1+2+3..+k 1+2+3..+k如果我们随便找一个数加上 k k k也是满足条件的
所以 n − k ∗ ( k + 1 ) 2 > 0 ∣ ∣ n − k ∗ ( k + 1 ) 2 = 0 n-\frac{k*(k+1)}{2} >0||n-\frac{k*(k+1)}{2} =0 n−2k∗(k+1)>0∣∣n−2k∗(k+1)=0
同时 k = s = 1 k=s=1 k=s=1是无解的,显然 s = 1 s=1 s=1的时候, k = 2 t + 1 k=2^{t+1} k=2t+1,所以
n − k ∗ ( k + 1 ) 2 = 2 t − k ∗ ( k + 1 ) 2 = 2 t + 1 − k ∗ ( k + 1 ) n-\frac{k*(k+1)}{2}=2^{t} -\frac{k*(k+1)}{2}=2^{t+1} -k*(k+1) n−2k∗(k+1)=2t−2k∗(k+1)=2t+1−k∗(k+1)
= 2 t + 1 − 2 t + 1 ∗ ( 2 t + 1 + 1 ) = 2 t + 1 ∗ ( 1 − ( 2 t + 1 + 1 ) ) < 0 显 然 =2^{t+1} -2^{t+1}*(2^{t+1}+1)=2^{t+1}*(1-(2^{t+1}+1)) < 0{显然} =2t+1−2t+1∗(2t+1+1)=2t+1∗(1−(2t+1+1))<0显然
因此 k = s = 1 k=s=1 k=s=1是矛盾的
所以 2 t ∣ ∣ s ! = 1 2^t || s!=1 2t∣∣s!=1至少有一个条件成立,才可能有解
特殊的如果 s = 1 s=1 s=1 我们只能取 2 x 2^x 2x
否则输出 − 1 -1 −1
赛场上 W A WA WA了 2发D就不敢再打了,但是其实思路都是错的 , 从素数的角度出发了
越跑越远简直是
看完题解之后感觉 E E E更简单一点Orz
const int N = 1e5+10;
void solve()
{
ll n;cin>>n;
ll s = n , q = 1;
while(s%2 == 0 ){
s/=2;
q*=2;
}
/**
将 n 拆分成 $s* (2^t)$
**/
if(q <= 1e9 && q*(2*q+1) <=n ){
cout<<2*q<<endl;
return;
}
if(s!=1 && s<=2e9 && s*(s+1)/2 <=n){
cout<<s<<endl;
return;
}
cout<<-1<<endl;
}