杭电2058

这是我的穷举源码,可惜超时了!哎!!!

#include<iostream> using namespace std; int main() {

 int  n,m,i,j,a;

 while(scanf("%d%d", &n, &m), m+n)

 {                      

for(i=1;i<=n;i++)     

{   a=0;       for(j=i;j<=n;j++)     

  {       a=a+j;       

         if(a==m)      

cout<<"["<<i<<","<<j<<"]"<<endl;      

}     

}     

putchar('\n');  

}

 return 0;

}

这是AC了的代码!!

穷举还是是穷举,还不能任意穷举,要不超时,FUCK! 设初始值i,个数为j的数列满足要求,则(i+i+j-1)*j/2=m ==>(2*i-1+j)*j=2m

所以j肯定小于等于sqrt(2*m),穷举 C语言源码:

#include<iostream>

#include<cmath>

int main()

{ int n,m,i,j;

while(scanf("%d%d",&n,&m)!=EOF&&m!=0||n!=0)

{

 for(j=(int)sqrt(2*m);j>=1;j--)

{

  i=(2*m/j+1-j)/2;;        

if((2*i+j-1)*j/2==m)        

printf("[%d,%d]\n",i,i+j-1); }        

putchar(“\n");

} return 0;

}

原文地址:https://www.cnblogs.com/xiohao/p/2710318.html