从A找B会超时,因为A的范围是10的6次方,但是看B的范围要开根号,B最大应该是(maxA+n-1)*1000+999开根号范围在300000左右,所以我们从B开始找A,那么还得看看B的最小是多少,因为一定要在A的末尾添三个数字且A>=1所以A最小是1000那么其对应的B就应该是根号1000推出B应该是>=32,因为32的平方就是2的十次方也就是1024
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int f(int x)
{
return x*x/1000;//b平方后去掉下三位
}
int main()
{
int n,ma;
cin>>n>>ma;
int mb=sqrt((ma+n-1)*1000+999);//求B的最大值
int cnt=0;//计数用于判断最后是否有solution
for(int b=32;b<=mb;b++)//遍历B的取值
{
int a=f(b);//b的平方需要对应一个a但是,只是对应去掉后三位的a,因为后三位可以随便取
bool success=true;
for(int i=1;i<=n-1;i++)//再判断在加上i后是不是一一对应的
{
if(f(b+i)!=a+i)
{
success=false;
break;
}
}
if(success)
{
cnt++;
cout<<a<<" "<<b<<endl;
}
}
if(cnt==0)cout<<"No Solution."<<endl;
return 0;
}