【洛谷习题】连续自然数和

题目链接:https://www.luogu.org/problemnew/show/P1147


水啊!话说最近老是在做水题。。。

相当于求一段公差为1的等差数列使得其和为M,利用公式可以很轻松地推出a(1-a)+b(b+1)=2M,也就是说,找到一组(a,b)满足上述式子,其实就是答案。

既然这么水,为什么要整理这道题呢?

注意注意!防水防爆防溢出!可恶的溢出!WA了我三个点!

额,还是说一下怎么找a和b吧,我们枚举a,就可以求出b(b+1),接下来只需要验证这个数是否可以表示成一个整数乘以该整数加1的形式。我是取其平方根t,看看他等不等于t(t+1)。这样做貌似是对的,,,暂时没反例。

总之一句话!谨防溢出!

 1 #include <cstdio>
 2 #include <cmath>
 3 
 4 typedef long long ll;
 5 
 6 inline int judge(ll x) {
 7     int t = (int)sqrt(x);
 8     if (t * (t + 1LL) == x) return t;
 9     else return 0;
10 }
11 
12 int main() {
13     int m, first = 1;
14     scanf("%d", &m);
15     for (int i = 1; i < m; ++i) {
16         ll j = 2 * m - i * (1LL - i);
17         int k = judge(j);
18         if (k) {
19             if (first) first = 0;
20             else putchar('
');
21             printf("%d %d", i, k);
22         }
23     }
24     return 0;
25 }
AC代码
原文地址:https://www.cnblogs.com/Mr94Kevin/p/9771377.html