码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces Round #315 (Div. 2) 568A Primes or Palindromes?

时间:2015-08-11 22:54:53      阅读:115      评论:0      收藏:0      [点我收藏+]

标签:

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

 

Codeforces Round #315 (Div. 2) 568A Primes or Palindromes?

标签:

原文地址:http://www.cnblogs.com/TaoTaoCome/p/4722336.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!