解题思路:因为数据范围1e6,所有只需要先把1e3内的平方数求出来,然后再检查a~b的每一个数。从最后一位数开始把当前数分割,如果不合法,就从最后两位数开始分割,直到整个数分割完后,还是不合法那就不合法。
#include<bits/stdc++.h>
#define x first
#define y second
#define mem(h) memset(h,-1,sizeof h)
#define mcp(a,b) memcpy(a,b,sizeof b)
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
typedef pair<int,int>PII;
typedef pair<double,double>PDD;
namespace IO{
inline LL read(){
LL o=0,f=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){o=o*10+c-'0';c=getchar();}
return o*f;
}
}using namespace IO;
const int N=1e3+7,M=2e5+7,INF=0x3f3f3f3f,mod=1e9+7,P=131;
map<int,bool>st;
int a,b;
bool check(int num){
int k=10;
while(num/k){
if(st[num%k]&&st[num/k])return true;
k*=10;
}
return false;
}
int main(){
cin>>a>>b;
for(int i=1;i<N;i++)st[i*i]=1;
for(int i=a;i<=b;i++){
if(st[i]){
if(check(i)){
cout<<i<<endl;
}
}
}
return 0;
}