問題 F: 超超的自閉意思
阿新 • • 發佈:2018-12-31
問題 F: 超超的自閉意思
時間限制: 1 Sec 記憶體限制: 128 MB提交: 80 解決: 10
[提交] [狀態] [命題人:jsu_admin]
題目描述
質數定義為在大於1的自然數中,除了1和它本身以外不再有其他因數。迴文數定義為在正整數中,從左到右,從右到左讀都相同的數字。(沒有前導零的十進位制)
現在 z(n) 表示不大於n的質數個數,h(n)表示不大於n的迴文數個數。
給定兩個數b, a。求最大n,滿足b * z(n) ≤ a * h(n)。
輸入
每組資料包含兩個整數b, a, 如題所述。
b,a < 10^4 , 1 / 42 <=b /a <= 42
輸出
如果存在這樣的n,則打印出來。如果不存在這樣的n ,輸出 “No”樣例輸入 Copy
2
1 1
4 6
樣例輸出 Copy
40
16
我們可以估算出最大的 n,當 a=1,b=10000 的時候,打表出來我們發現只會到達 2*1e6,所以我們可以從 1-2*1e6 開始判斷,判斷到新的滿足要求的 n 就更新,但是 我們每次單獨判斷一個數是不是素數很費時間,會超時,所以我們用素篩打一個表節 約時間,然後判斷一個數是不是迴文也是根據那個數的位數來的,所以不必擔心,然 後就是直接暴力判斷
1 #include<stdio.h> 2 #include<vector> 3 #include<cstring> 4 #include<cmath> 5 using namespace std; 6 int cnt = 0; 7 const int MAXN = 5010; 8 int prime[MAXN];//第i個素數 9 bool is_pri[MAXN+10];//is_pri[i]表示i是素數 10 //返回n以內素數的個數 11 intView Codesieve(int n){ 12 int p=0; 13 for(int i=0;i<=n;i++)is_pri[i]=true; 14 is_pri[0]=is_pri[1]=false; 15 for(int i=2;i<=n;i++){ 16 if(is_pri[i]){ 17 prime[++p]=i; 18 for(int j=2*i;j<=n;j+=i)is_pri[j]=false; 19 } 20 } 21 return p; 22 } 23 //迴文數 24 int palindrome(int a,int x) 25 { 26 int t; 27 do 28 { 29 t=x%10; 30 a=a*10+t; 31 x=x/10; 32 } 33 while(x>0); 34 return a; 35 } 36 37 int huiwen(int n) 38 { 39 int a,x,c,i; 40 // while(scanf("%d",&n)&&n!=0) 41 // { 42 c=0; 43 for(i=1; i<=n; i++) 44 { 45 a=0; 46 x=i; 47 a=palindrome(a,x); 48 if(a==i) c++; 49 } 50 // printf("%d\n",c); 51 // } 52 return c; 53 } 54 55 bool isPrime(int num) 56 { 57 if(num == 2) 58 return true; 59 int tmp = sqrt(num); 60 for(int i=2;i<=tmp;i++) 61 { 62 if(num%i == 0) 63 { 64 return false; 65 } 66 } 67 return true; 68 } 69 bool isHuiwen(int x) 70 { 71 int newed,t,n; 72 // while(scanf("%d",&x)!=EOF) 73 //{ 74 newed=0; 75 n=x; 76 do 77 { 78 newed=newed*10+x%10; 79 x/=10; 80 }while(x>0); 81 if(n==newed) 82 return true; 83 else 84 return false; 85 // } 86 } 87 int dp[3000020]; 88 int dp2[3000020]; 89 90 void dabiao(){ 91 dp[0] = 0; 92 dp[1] = -1; 93 dp2[0] = 0; 94 for(int i = 1;i<2*1e6+100;i++) 95 { 96 dp[i] += dp[i-1]+isPrime(i); 97 dp2[i] += dp2[i-1]+isHuiwen(i); 98 } 99 } 100 int main() 101 { 102 int t; 103 int b , a; 104 dabiao(); 105 scanf("%d",&t); 106 107 for(int i = 0 ;i < t;i++) 108 { 109 // cnt = 0; 110 int sum = 0; 111 scanf("%d%d",&b,&a); 112 for(int j = 1;j<2*1e6+100;j++){ 113 /// vector<int> prime = Prime(j); 114 // cnt = prime.size(); 115 if(a*dp[j]<=b*dp2[j])//b*Prime(n)<=a*huiwen(n) 116 sum = j; 117 118 } 119 if(sum) 120 printf("%d\n",sum); 121 else 122 printf("No"); 123 } 124 }