http://acm.hdu.edu.cn/showproblem.php?pid=2058

 

思路:因为n非常大,用暴力法和双指针尺取法都很容易TLE,但我们发现这是最简单的等差数列,通过等差数列求和公式可以大致推出长度最大值len,然后枚举len推出初值a,套公式进行求和运算,就可以A掉这道题

 

代码:

 1 #include <stdio.h>
 2 #include <math.h>
 3 int main()
 4 {
 5   int n, m, len, a;
 6   while(~scanf("%d%d", &n,&m))
 7   {
 8     if(!n && !m)
 9       break;
10     len = sqrt(double(m * 2)) + 1;
11     /*根据等差数列来算,数列长度
12     m = (a + a + len - 1) * len / 2
13     m = a * len + len(len - 1)/ 2
14     m - len * (len - 1) / 2 = a * len
15     a = m / len - (len - 1) / 2*/
16     while(--len)
17     {
18       a = m / len - (len - 1) / 2;
19       if((a + a + len - 1) * len / 2 == m)
20       {
21         printf("[%d,%d]\n", a, a+len - 1);
22       }
23     }
24     printf("\n");
25   }
26   return 0;
27 }

 

posted on 2017-02-20 15:37  benTuTuT  阅读(201)  评论(0编辑  收藏  举报