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;
}
posted @ 2025-07-16 21:28  STD//  阅读(17)  评论(0)    收藏  举报