杭电ACM2058--The sum problem

来源:互联网 发布:开源淘宝客系统 编辑:程序博客网 时间:2024/06/14 11:00

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]\n",i,j); }}printf("\n");}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]\n",i,i+j-1);}printf("\n");}return 0;}</span>


 

 

 

0 0
原创粉丝点击