Atcoder1371题解

我们先分析一下题目。

假设摆了 k k k 行,可以进行如下推导:

k × ( k + 1 ) ÷ 2 = n k\times (k+1)\div2=n k×(k+1)÷2=n

 ⁣ ⁣ k × ( k + 1 ) = n × 2 \quad \quad \!\!k\times (k+1)=n\times 2 k×(k+1)=n×2

因为 k 2 < k × ( k + 1 ) < ( k + 1 ) 2 k^2<k\times(k+1)<(k+1)^2 k2<k×(k+1)<(k+1)2,也即 k 2 < 2 × n < ( k + 1 ) 2 k^2<2\times n<(k+1)^2 k2<2×n<(k+1)2 ,开方可以得到 k < 2 × n < k + 1 k<\sqrt{2\times n}<k+1 k<2×n <k+1 ,说明 ⌊ 2 × n ⌋ = k \lfloor \sqrt{2\times n} \rfloor = k 2×n =k

所以可以通过判断 ⌊ 2 × n ⌋ × ( ⌊ 2 × n ⌋ + 1 ) \lfloor \sqrt{2\times n} \rfloor \times(\lfloor \sqrt{2\times n} \rfloor+1) 2×n ×(2×n +1) 是否等于 n × 2 n \times 2 n×2 即可。

上代码:

#include <bits/stdc++.h>
using namespace std;
long long n,k;
int main(){
	cin>>n;
	k=sqrt(n*2);
	if(k*(k+1)/2==n)cout<<k;
	else cout<<-1;
        return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值