Digital Square
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 829 Accepted Submission(s): 348
Problem Description
Given an integer N,you should come up with the minimum nonnegative integer M.M meets the follow condition: M2%10x=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 <=109), 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
题意
题目给出N,求最小的M,使得M^2 % 10^x = N。
N<=10^9,如果不存在输出None。
解法
从低位向高位高位广搜,如果当前情况满足M^2 % 10^x = N % 10^x,则继续往下广搜。
#include "iostream"
#include "cstdio"
#include "queue"
using namespace std;
struct Node{
__int64 m, x;
Node()
{
m = 0;
x = 0;
}
bool operator < (const Node &a) const
{
return a.m < m;
}
};
int n;
priority_queue<Node> q;
void bfs()
{
q.push(Node());
while(!q.empty())
{
Node cn = q.top();
q.pop();
int i, ten = 1;
for(i = 0; i < cn.x; i++)
{
ten *= 10;
}
if((cn.m * cn.m) % ten == n)
{
printf("%d\n", cn.m);
return;
}
for(i = 0; i < 10; i++)
{
Node temp;
temp.m = cn.m + i * ten;
temp.x = cn.x + 1;
if((temp.m * temp.m) % (ten * 10) == n % (ten * 10))
{
q.push(temp);
}
}
}
printf("None\n");
}
int main()
{
int t;
scanf("%d", &t);
while(t--)
{
scanf("%d", &n);
if(n == 2 || n == 3 || n == 7 || n == 8)
{
printf("None\n");
}
else
{
bfs();
}
}
return 0;
}