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 }