Codeforces Round #315 (Div. 2C) 568A Primes or Palindromes? 素数打表+暴力

题目: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 }

 

posted @ 2015-08-11 21:06  TaoTaoCome  阅读(268)  评论(0编辑  收藏  举报