http://acm.hdu.edu.cn/showproblem.php?pid=2058
以为简单的穷举就完了,结果是一直Time Limit Exceeded。。
这是代码:
#include <stdio.h> #include <stdlib.h> #include <math.h> int main() { int a,b; int i,j,k; while (scanf("%d%d",&a,&b)!=EOF&&(a!=0||b!=0)) { for (i=1;i<=a;i++) { k = 0; for (j=i;j<=i+(int)sqrt((double)(2*b))+1;j++) { k = k+j; if (k == b) printf("[%d,%d] ",i,j); } } printf(" "); } return 0; }
穷举是穷举,还不能任意穷举,要不超时!
设初始值i,个数为j的数列满足要求,则(i+i+j-1)*j/2=m
==>(2*i-1+j)*j=2m
所以j肯定小于等于sqrt(2*m),穷举。
之后才发现数据量之大,然后找到了解决办法。
<span style="font-size:24px;"> #include <stdio.h> #include <stdlib.h> #include <math.h> int main() { int a,b; int i,j,k; while (scanf("%d%d",&a,&b)!=EOF&&a&&b) { for (j=(int)sqrt((double)(2*b));j>=1;j--) { i = (2*b/j+1-j)/2; if (b == (2*i+j-1)*j/2) printf("[%d,%d] ",i,i+j-1); } printf(" "); } return 0; } </span>