标签:
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]\n",k,k+l-1); 14 l--; 15 } 16 printf("\n"); 17 } 18 return 0; 19 }
hdu - 2058 The sum problem (数学题)
标签:
原文地址:http://www.cnblogs.com/nowandforever/p/4566860.html