Digital Square
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 704 Accepted Submission(s): 315
Problem Description
Given an integer N,you should come up with the minimum
nonnegative integer M.M meets the follow condition: M
2%10
x=N (x=0,1,2,3....)
Input
The first line has an integer T( T< = 1000), the number of test cases.
For each case, each line contains one integer N(0<= N <=10 9), indicating the given number.
For each case, each line contains one integer N(0<= N <=10 9), indicating the given number.
Output
For each case output the answer if it exists, otherwise print “None”.
Sample Input
3 3 21 25
Sample Output
None 11 5
Source
Recommend
zhuyuanchen520
题意:给出N,找出满足M2%10x=N的M
题解:可知,若N有多少位,M的多少位就可以确定下来,这样用bfs搜索一次就可以了
#include<cstdio>
#include<queue>
using namespace std;
long long n,cc[23];
struct node{
long long now;
int len,next;
node(){}
node(long long _n,int _l,int _nex):now(_n),len(_l),next(_nex){}
bool operator < (const node n1) const
{
return now>n1.now;
}
}x,y;
void bfs()
{
priority_queue<node>q;
long long temp=n,l=0;
while(temp){ l++; temp/=10; }
q.push(node(0,0,0));
while(!q.empty())
{
x=q.top();
q.pop();
if(x.len==l){ printf("%I64d\n",x.now); return; }
if(x.next!=9) q.push(node(x.now,x.len,x.next+1));
y=node(x.now,x.len+1,0);
y.now=y.now+cc[x.len]*x.next;
if((y.now*y.now)%cc[y.len]==n%cc[y.len]) q.push(y);
}
printf("None\n");
}
int main()
{
int t,i;
for(cc[0]=i=1;i<=20;i++) cc[i]=cc[i-1]*10;
scanf("%d",&t);
while(t--)
{
scanf("%I64d",&n);
bfs();
}
return 0;
}