同 ID 3463,給定 p, q(A=p/q ≤ 42),求最大 n 使 π(n) ≤ A·rub(n)。
上界分析:質數密度 ~ 1/ln n,回文數密度 ~ √n/n = 1/√n。質數增長最終超過回文數。實測 n≈1.2×10⁶ 時 π(n) ≈ 42·rub(n)。因 A≤42,答案 ≤ 1.2×10⁶。
is_prime[1..MAXN]pi[i] = pi[i-1] + is_prime[i]rub[i] = rub[i-1] + is_pal(i)從 MAXN 向下枚舉,找到第一個滿足 q * pi[i] <= p * rub[i] 的 i。若無則輸出 "Palindromic tree is better than splay tree"(但題目保證有解)。
const int MAXN = 1200000;
bool is_prime[MAXN+1];
int pi[MAXN+1], rub[MAXN+1];
bool is_pal(int x) {
int orig = x, rev = 0;
while (x) { rev = rev*10 + x%10; x/=10; }
return orig == rev;
}
int main() {
// 篩法
fill(is_prime+2, is_prime+MAXN+1, true);
for (int i=2; i*i<=MAXN; ++i)
if (is_prime[i])
for (int j=i*i; j<=MAXN; j+=i) is_prime[j]=false;
for (int i=1; i<=MAXN; ++i) pi[i] = pi[i-1] + is_prime[i];
for (int i=1; i<=MAXN; ++i) rub[i] = rub[i-1] + is_pal(i);
int p, q; scanf("%d%d", &p, &q);
for (int i = MAXN; i >= 1; --i)
if (1LL * q * pi[i] <= 1LL * p * rub[i]) {
printf("%d\n", i); return 0;
}
puts("Palindromic tree is better than splay tree");
}
long long 防止乘法溢出