hdu

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

求1-N多少个连续字段和等于M.

假设 从i开始长度为k的字段和等于M,那么 ( i+  i+k-1) * k/2=M即(2*i+k-1)*k==2M   那么 从k<= sqrt(2*M);

i=M/k-(k-1)/2.这样通过从大到小枚举k的长度,并同时计算i的值判断和是否等于M,输出即可.

注意从(2*i+k-1)*k==2M这个式子得出的是k<=sqrt(2*M)而不是i,这样是为了方便计算,并且从大到小枚举k,也保证输出是按顺序输出。

 1 #include<stdio.h>
 2 #include<math.h>
 3 int main()
 4 {
 5     int n,m,l,k;
 6     while(scanf("%d %d",&n,&m)!=EOF&&n||m)
 7     {
 8         l=(int)sqrt(double(2*m));
 9         while(l)
10         {
11             k=m/l-(l-1)/2;
12             if(k*l+l*(l-1)/2==m)
13                 printf("[%d,%d]
",k,k+l-1);
14             l--;
15         }
16         printf("
");
17     }
18     return 0;
19 }
原文地址:https://www.cnblogs.com/nowandforever/p/4566860.html