luogu P2425 小红帽的回文数 (进制相关 +即兴算法)

任重而道远

题目描述

小红帽喜欢回文数,但生活中的数常常不是回文数。现在她手上有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;
}

猜你喜欢

转载自blog.csdn.net/INTEGRATOR_37/article/details/83478303
今日推荐