本题题意很简单,略掉。这里首先要讲一个问题,就是一个数的平方的后n位数是有该数的后n位决定的,证明略。这样就可以用搜索剪枝的方法去做了。附代码:
#include <iostream>
#include <queue>
using namespace std;
struct node
{
int v;
int d;
};
queue<node>q;
const int Max=0xfffffff;
int bit(int n)
{
int m=n,t=0;
while (m>0)
{
t++;
m/=10;
}
return t;
}
int mul(int x)
{
int z=1;
if (x==0) return 1;
for (int i=1;i<=x;i++) z*=10;
return z;
}
int main()
{
int t,mmin,mi,t1,T,n,i;
__int64 s,r;
scanf("%d",&T);
while (T--)
{
scanf("%d",&n);
if (n==0)
{
printf("%d\n",0);
continue;
}
t=mul(bit(n));
while (!q.empty()) q.pop();
node init;
init.v=init.d=0;
q.push(init);
mmin=Max;
mi=-1;
while (!q.empty())
{
node k=q.front();
if (k.d==mi) break;
if (mul(k.d)==t) break;
for (i=0;i<=9;i++)
{
t1=mul(k.d);
s=t1*i+k.v;
t1*=10;
r=s*s-n;
if (r%t1==0)
{
node ss;
ss.v=s;
ss.d=k.d+1;
q.push(ss);
if (r%t==0)
{
if (s<mmin)
{
mmin=s;
mi=ss.d;
}
}
}
}
q.pop();
}
if (mi<0) printf("None\n");
else printf("%d\n",mmin);
}
return 0;
}