题目链接:
水啊!话说最近老是在做水题。。。
相当于求一段公差为1的等差数列使得其和为M,利用公式可以很轻松地推出a(1-a)+b(b+1)=2M,也就是说,找到一组(a,b)满足上述式子,其实就是答案。
既然这么水,为什么要整理这道题呢?
注意注意!防水防爆防溢出!可恶的溢出!WA了我三个点!
额,还是说一下怎么找a和b吧,我们枚举a,就可以求出b(b+1),接下来只需要验证这个数是否可以表示成一个整数乘以该整数加1的形式。我是取其平方根t,看看他等不等于t(t+1)。这样做貌似是对的,,,暂时没反例。
总之一句话!谨防溢出!
1 #include2 #include 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 }