链接
题目描述
给出一个数字,已知这个数字是一段连续正整数之和,求这段正整数的最短长度
思路
正解和大部分人的思路好像都是什么约数什么的
我的是,
s
u
m
=
k
∗
n
+
k
2
+
k
2
sum = k * n + \frac{k^2 + k}{2}
sum=k∗n+2k2+k
因为
k
<
=
n
k <= \sqrt{n}
k<=n所以时间复杂度是根号n
(有点神奇的是数据蛮好的,k都很小
代码
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define ldb long double
#define ll long long
#define ull unsigned long long
using namespace std;
ull n, ans;
int main() {
scanf("%llu", &n);
for (ull i = 2; i <= sqrt(n); ++i) {
ull p = (i * i + i) >> 1;
ull now = n - p;
ldb la = (ldb)now / (ldb)i;//n除出来是否是个整数
if (la == (ull)la) {
ans = i;
printf("%llu", i);
break;
}
}
if (!ans)
printf("-1");
return 0;
}