原题连接
打草稿可知,一个数n平方后个位数为一个给定值,n只有最多只要两种情况,可用dfs
#include <iostream>
using namespace std;
const int N = 20;
int a[N], n, m;//a数组存答案
string s;
bool flag;
int len;
bool check(int k) { //判断数组的第k位填写是否合法
int l = max(0, k - len + 1), r = min(len - 1, k);
int ans = 0;
for (int i = l, j = r; i <= r; i ++, j --)
ans = (ans + a[i] * a[j]) % 10;
return ans == s[k] - '0';
}
bool check() { //上一个check函数将原数填满只能保证s的前len位得到满足,而后s.size() - len位需继续判断
for (int k = len; k < s.size(); k ++) {
int l = max(0, k - len + 1), r = min(len - 1, k);
int ans = 0;
for (int i = l, j = r; i <= r; i ++, j --)
ans = (ans + a[i] * a[j]) % 10;
if (ans != s[k] - '0')
return 0;
}
return 1;
}
void dfs(int u, int k) {
if (flag)return;
if (k == len) {
if (check()) flag = 1;
return;
}
for (int i = u; i < 10; i ++) {
a[k] = i;
if (check(k)) dfs(0, k + 1);
if (flag) return;
}
}
int main() {
cin >> s;
len = s.size() + 1 >> 1;
dfs(1, 0); //第一位不能填0
if (!flag) cout << -1;
else {
for (int i = 0; i < len; i ++)cout << a[i];
}
return 0;
}