1. 程式人生 > >luogu P2425 小紅帽的迴文數 (進位制相關 +即興演算法)

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;
}