CodeTON Round 1 (Div. 1 + Div. 2, Rated, Prizes) D.K -good

前言

传送门 :

题解参考pzr :

思路

将题意转换为
n − k ∗ ( k + 1 ) 2 ≡ 0   m o d   k n-\frac{k*(k+1)}{2} \equiv 0\ mod \ k n2k(k+1)0 mod k

意为 n − k ∗ ( k + 1 ) 2 是 k 的 倍 数 n-\frac{k*(k+1)}{2} 是 k的倍数 n2k(k+1)k n − k ∗ ( k + 1 ) 2 = m ∗ k n-\frac{k*(k+1)}{2} =m*k n2k(k+1)=mk

n = m ∗ k + k ∗ ( k + 1 ) 2 n =m*k +\frac{k*(k+1)}{2} n=mk+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的因子 kn

这里我们分类讨论一下

  • 如果 k k k是偶数,那么 k 2 \frac{k}{2} 2k也应该是 n n n的因子
  • 如果 k k k是奇数,那么只能得出 k k k n n n的因子

我们将 n n n分解为 2 t ∗ s ( s 是 奇 数 ) 2^t*s(s是奇数) 2ts(s)

  • s s s,因为 s s s为奇数,所以由上面的性质可得 k = s k=s k=s
  • 2 t 2^t 2t,因为 2 t 2^t 2t为偶数,所以由上面的性质可得 k 2 = 2 t \frac{k}{2}=2^t 2k=2t

同时我们还需要使得 n − k ∗ ( k + 1 ) 2 > = 0 n-\frac{k*(k+1)}{2} >=0 n2k(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 n2k(k+1)>0n2k(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) n2k(k+1)=2t2k(k+1)=2t+1k(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+12t+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 2ts!=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

Mycode

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;
	
	
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值