【洛谷习题】连续自然数和
题目链接: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('\n'); 21 printf("%d %d", i, k); 22 } 23 } 24 return 0; 25 }