AT_abc414_c [ABC414C] Palindromic in Both Bases
AT_abc414_c
思路
蒟蒻发题解,勿喷。由于n很大,所以我们不能遍历寻找回文数。我们需要自己构造出来所有的10进制回文数,然后判断是否是a进制下的回文数。
复杂度
没算,但能过
代码
#include <bits/stdc++.h>
using namespace std;
long long f(long long x) {//翻转
if (x == 0) return 0;
long long res = 0;
while (x > 0) {
res = res * 10 + x % 10;
x /= 10;
}
return res;
}
bool g(long long num, int A) {//转换进制+判断
if (num == 0)
return true;
vector<int> digits;
long long n = num;
while (n > 0) {
digits.push_back(n % A);
n /= A;
}
int left = 0, right = digits.size() - 1;
while (left < right) {
if (digits[left] != digits[right])
return false;
left++;
right--;
}
return true;
}
long long ans,A,N;
int main() {
cin >> A >> N;
vector<long long> num(16);
num[0] = 1;
for (int i = 1; i <= 15; i++) {
num[i] = num[i - 1] * 10;
}
string ns = to_string(N);
int D = ns.size();
for (int d = 1; d <= D; d++) {
int h = (d + 1) / 2;
for (long long x = num[h-1]; x <= num[h]-1; x++) {
long long struc;
if (d % 2 == 0) {
long long res = f(x);
struc = x * num[h] + res;
} else {
long long res = f(x / 10);
struc = x * num[h - 1] + res;
}
if (struc > N) break;
if (struc < 1) {
continue;
}
if (g(struc, A)) {
ans += struc;
}
}
}
cout << ans << endl;
return 0;
}

浙公网安备 33010602011771号