luogu P2425 小紅帽的迴文數 (進位制相關 +即興演算法)
阿新 • • 發佈:2018-10-31
任重而道遠
題目描述
小紅帽喜歡迴文數,但生活中的數常常不是迴文數。現在她手上有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; }