Digital Square (数位+BFS)

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.
Output
For each case output the answer if it exists, otherwise print “None”.
Sample Input
3
3
21
25
Sample Output
None
11
5
对于M^2取余,个位数只与M的个位有关,十位数与M的十位,个位有关,所以这个题与数位有关;

直接代码吧:

#include <iostream>
#include <algorithm>
#include <queue>

using namespace std;

long long N;
struct node{
	long long val;   //当前数的值;
	long long mod;   
	friend bool operator < (node a, node b){
		return a.val>b.val;
	}
};
void bfs(long long tmod){
	priority_queue<node> q;
	node tem;
	for(int i=0; i<=9; i++){
		if(i*i%10==N%10){
			tem.val=i;
			tem.mod=10;
			q.push(tem);
		}
	}
	while(!q.empty()){
		tem=q.top();
		q.pop();
		if(tem.val*tem.val%tmod==N){
			cout << tem.val << endl;
			return ;
		}
		for(int i=0; i<=9; i++){
			long long vv=tem.val+tem.mod*i;
			if(vv*vv%(tem.mod*10)==N%(tem.mod*10)){
				node a;
				a.val=vv;
				a.mod=tem.mod*10;
				q.push(a);
			}
		}
	}
	cout << "None\n";
	return;
}
int main(){
	int T;
	cin >> T;
	while(T--){
		cin >> N;
		long long tem=N;
		int cnt;
		long long tmod=1;
		while(tem){
			tem/=10;
			tmod*=10;
		}
		bfs(tmod);
	}
	return 0;
}










  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值