杭电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;
}
联系方式