任重而道远
题目描述
小红帽喜欢回文数,但生活中的数常常不是回文数。现在她手上有t个数,现在她知道这t个数分别在x进制下是回文数(x>=2),请你对于每个数求出最小的x.
输入输出格式
输入格式:
第一行为一个t(1<=t<=1000)
接下来的t行,每行为一个数ai(0<=ai<=10^10)。
输出格式:
输出有t行,每行为所求的x。
输入输出样例
输入样例#1: 复制
4
1
4
21
345332
输出样例#1: 复制
2
3
2
114
说明
【样例解释】
1在二进制下为1,4在三进制下为1 1,
21在2进制下为1 0 1 0 1,345332在114进制下为26 65 26
AC代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
ll T, a;
ll read () {
ll x = 0, f = 1; char c = getchar ();
while (c < '0' || c > '9') {if (c == '0') f = -1; c = getchar ();}
while (c >= '0' && c <= '9') {x = x * 10 + c - '0'; c = getchar ();}
return x * f;
}
bool check (ll x, ll p) {
ll tot = 0, digit[65];
while (x) {
digit[++tot] = x % p;
x /= p;
}
ll l = 1, r = tot;
while (l <= r) {
if (digit[l] != digit[r]) return false;
l++, r--;
}
return true;
}
int main () {
T = read ();
while (T--) {
a = read ();
ll x = (int) sqrt ((double) a) + 1;
for (ll i = 2; i <= x; i++)
if (check (a, i)) {
printf ("%lld\n", i);
goto Nxt;
}
for (ll i = a / x - 1; i; i--)
if (a / i * i == a) {
printf ("%lld\n", a / i - 1);
goto NXT;
}
printf ("%lld\n", a + 1);
Nxt:; NXT:;
}
return 0;
}