hdu Digital Square(广搜)
题目:给出n,求出最小的m,满足m^2 % 10^k = n,其中k=0,1,2
http://acm.hdu.edu.cn/showproblem.php?pid=4394
只要有一个x满足条件便行了
我们可以初步发现,某个数个位确定,那么平方的最后一位肯定是确定的,那么如果后两们确定,那么平方的最后两们也是确定的,这可以通过乘法的规律得到
那我们只需要BFS一下,不断地找满足最后指定位数的数,1位,2位,……直到找到第一个满足条件的。
注意这里可能是100001这种情况
所以记录当前数字大小,当前位置,可能暂时的高位为0,以后下一个添加的数为多少.
// Time 0ms; Memory 316K
#include<iostream> #include<queue> using namespace std; #define ll long long ll n,ans; struct node { ll l,s; }; void bfs() { queue<node>q; node x,y; x.l=1;x.s=0; q.push(x); ans=-1; while(!q.empty()) { x=q.front();q.pop(); for(ll i=0;i<10;i++) { y.s=x.s+i*x.l; y.l=x.l*10; if((y.s*y.s)%y.l==n%y.l) { if((y.s*y.s)%y.l==n) { if(ans==-1 || ans>y.s) ans=y.s; else if(ans==y.s) return; } q.push(y); } } } return; } int main() { int t; cin>>t; while(t--) { cin>>n; if(n==0) { cout<<"0"<<endl;continue; } bfs(); if(ans>0) cout<<ans<<endl; else cout<<"None"<<endl; } return 0; }