题目:Click here
题意:π(n)表示不大于n的素数个数,rub(n)表示不大于n的回文数个数,求最大n,满足π(n) ≤ A·rub(n)。A=p/q;
分析:由于这个题A是给定范围的,所以可以先暴力求下最大的n满足上式,可以想象下随着n的增大A也在增大(总体正相关,并不是严格递增的),所以二分查找时不行的,所以对给定的A,n是一定存在的。这个题的关键就是快速得到素数表最好在O(n)的时间以内。(杭电15多校的一个题也用到了这个算法点这里查看)
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int M = 1179858+3; 4 5 double p, q; 6 bool prime[M]; 7 int ans, pri, pal; 8 void getprime( ) { // 类似筛选法求素数 打表 9 prime[1] = false; 10 for( int i=2; i<M; i++ ) { 11 if( !prime[i] ) continue; 12 prime[i] = true; 13 for( int j=2; j*i<M; j++ ) 14 prime[i*j] = false; 15 } 16 } 17 18 bool palindromic( int n ) { // 判断回文数 19 int fn = 0; 20 int aun = n; 21 while( aun ) { 22 fn *= 10; 23 fn += aun%10; 24 aun /= 10; 25 } 26 return fn == n ; 27 } 28 29 int main() { 30 memset( prime, true, sizeof(prime) ); 31 getprime( ); 32 while( ~scanf("%lf%lf", &p, &q ) ) { 33 double A = p/q; 34 pri = pal = 0; 35 for( int i=1; i<M; i++ ) { 36 pri += prime[i]; 37 pal += palindromic(i); 38 if( pal*p/q >= pri ) 39 ans = i; 40 } 41 printf("%d\n", ans ); 42 } 43 return 0; 44 }
时间: 2024-10-06 08:00:10