杭电2058

来源:互联网 发布:数据库join用法 编辑:程序博客网 时间:2024/04/28 20:36

刚开始想着通过a算出b再判断是否满足,但是这样要做n,m中那个小的数次循环,当n和m均很大的时候就会超时,如下:

#include<iostream>
#include<cmath>
using namespace std;
int main()
{
 __int64 n,m,l,i,b;
 double a;
 while((cin>>n>>m)&&(n!=0&&m!=0))
 {

if(n>m)
  l=m;
  else
  l=n;  

for(i=1;i<=l;i++)
  {
   a=sqrt((i-0.5)*(i-0.5)+2*m)-0.5;
   b=a;
   if(a==b&&a<=n)
   cout<<'['<<i<<','<<b<<']'<<endl;
  }
  cout<<endl;
 }
}

刚开始纠结怎么样让那个循环更小,但是如果那样判断就无法精简,所以就换判断方法:(看别人的代码好久才明白)

因为(b-a+1)<sqrt(2*m);所以设置条件i<sqrt(2*m);从sqrt(2*m)处开始检索,令b-a+1=i,算出2*b=2*m/i+i-1,a=2*m/i-b;

#include<iostream>
#include<cmath>
using namespace std;
int main()
{
 double n,m;
 int a,b,c;
 while((cin>>n>>m)&&(n!=0&&m!=0))
 {
  int i=sqrt(2*m);
  c=m;
  for(;i>=1;i--)
  {
   if((2*c)%i==0)判断a+b是否为整数
   {
    if((2*c/i+i-1)%2==0)//判断b是否为整数
    {
     b=(2*m/i+i-1)/2;
     a=2*m/i-b;
     cout<<'['<<a<<','<<b<<']'<<endl;
    }
   }
  }
  cout<<endl;
 }
}

原创粉丝点击