杭电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;

}

posted on 2012-10-02 15:57  @ 小浩  阅读(348)  评论(0编辑  收藏  举报