[USACO1.5] 回文质数

P1217  Prime Palindromes

题目描述

因为151既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数。

写一个程序来找出范围[a,b](5 <= a < b <= 100,000,000)( 一亿)间的所有回文质数;

输入格式:

第 1 行: 二个整数 a 和 b .

输出格式:

输出一个回文质数的列表,一行一个。

思路:枚举一半长度的整数即可。

代码:

 1 #include"bits/stdc++.h"
 2 #define ll long long
 3 #define ci(x) scanf("%d",&x)
 4 #define cd(x) scanf("%lf",&x)
 5 #define cl(x) scanf("%lld",&x)
 6 #define pi(x) printf("%d\n",x)
 7 #define pd(x) printf("%f\n",x)
 8 #define pl(x) printf("%lld\n",x)
 9 using namespace std;
10 const int N   = 1e6 + 5;
11 const int mod = 1e9 + 7;
12 ll a[N],b[N];
13
14 ll mod_mul(ll a, ll b, ll mod) {
15     ll ret = 0;
16     while(b) {
17         if(b & 1)  ret = (ret + a) % mod;
18         a = (a + a) % mod;
19         b >>= 1;
20     }
21     return ret;
22 }
23
24 ll mod_exp(ll a, ll b, ll mod) {
25     ll ret = 1;
26     while(b) {
27         if(b & 1) ret = mod_mul(ret, a, mod);
28         a = mod_mul(a, a, mod);
29         b >>= 1;
30     }
31     return ret;
32 }
33
34 bool check(ll a, ll n) {
35     ll x = n - 1, y;
36     int t = 0;
37     while((x & 1) == 0) {
38         x >>= 1;
39         t++;
40     }
41     x = mod_exp(a, x, n);
42
43     for(int i = 1; i <= t; i++) {
44         y = mod_exp(x, 2, n);
45         if(y == 1 && x != 1 && x != n - 1) return true;
46         x = y;
47     }
48     if(y != 1) return true;
49     return false;
50 }
51
52 bool mill(ll n, int times = 10) {
53     if(n == 2) return true;
54     if(n == 1 || !(n & 1)) return false;
55
56     for(int i = 1; i <= times; i++) {
57         ll a = rand() % (n - 1) + 1;
58         if(check(a, n)) return false;
59     }
60     return true;
61 }
62 int p=1,q=0;
63 int n;
64 int l,r;
65 void init()//预处理出所有的回文质数
66 {
67     string f,e;
68     a[0]=11;
69     for(ll i=5;i<=10000;i++){
70         e=to_string(i);
71         f=e;
72         reverse(f.begin(),f.end());
73         e=e+f;
74         ll x=(ll)atoi(e.data());
75         if(mill(x)==1) b[q++]=x;
76
77         e=to_string(i);
78         f=e.substr(0,e.size()-1);
79         reverse(f.begin(),f.end());
80         e=e+f;
81         ll y=(ll)atoi(e.data());
82         if(mill(y)==1) a[p++]=y;
83     }
84     int k=0;
85     for(int i=p;i<p+q;i++) a[i]=b[k++];
86     sort(a,a+p+q);
87     n=p+q;
88 }
89 int main ()
90 {
91     init();
92     ios::sync_with_stdio(0);
93     cin>>l>>r;
94     for(int i=0;i<n;i++) if(l<=a[i]&&a[i]<=r) pl(a[i]);
95     return 0;
96 }

原文地址:https://www.cnblogs.com/mj-liylho/p/9038844.html

时间: 2024-07-30 16:55:51

[USACO1.5] 回文质数的相关文章

luogu P1217 [USACO1.5]回文质数 Prime Palindromes x

P1217 [USACO1.5]回文质数 Prime Palindromes 题目描述 因为151既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数. 写一个程序来找出范围[a,b](5 <= a < b <= 100,000,000)( 一亿)间的所有回文质数; 输入输出格式 输入格式: 第 1 行: 二个整数 a 和 b . 输出格式: 输出一个回文质数的列表,一行一个. 输入输出样例 输入样例#1: 5 500 输出样例#1: 5 7 11 101

P1217【洛谷FromUSACO】[USACO1.5]回文质数 Prime Palindromes

直接上题——[传送门:http://www.luogu.org/problem/show?pid=1217] 题目来源USACO,NOCOW翻译,洛谷转载,懂(F_Q)的童鞋们可以去USACO官网逛逛……<!———————————下面是原题—————————————————————————————--> P1217 [USACO1.5]回文质数 Prime Palindromes 题目描述 因为151既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数.写一个程

洛谷 P1217 [USACO1.5]回文质数 Prime Palindromes

P1217 [USACO1.5]回文质数 Prime Palindromes 题目描述 因为151既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数. 写一个程序来找出范围[a,b](5 <= a < b <= 100,000,000)( 一亿)间的所有回文质数; 输入输出格式 输入格式: 第 1 行: 二个整数 a 和 b . 输出格式: 输出一个回文质数的列表,一行一个. 输入输出样例 输入样例#1: 复制 5 500 输出样例#1: 复制 5 7

洛谷 P1217 [USACO1.5]回文质数 Prime Palindromes【取回文数/数论/字符串】

题目描述 因为151既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数. 写一个程序来找出范围[a,b](5 <= a < b <= 100,000,000)( 一亿)间的所有回文质数; 输入输出格式 输入格式: 第 1 行: 二个整数 a 和 b . 输出格式: 输出一个回文质数的列表,一行一个. 输入输出样例 输入样例#1: 复制 5 500 输出样例#1: 复制 5 7 11 101 131 151 181 191 313 353 373 383

P1217 [USACO1.5]回文质数 Prime Palindromes

题目描述 因为151既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数. 写一个程序来找出范围a,b( 一亿)间的所有回文质数; 输入输出格式 输入格式: 第 1 行: 二个整数 a 和 b . 输出格式: 输出一个回文质数的列表,一行一个. 输入输出样例 输入样例#1: 5 500 输出样例#1: 5 7 11 101 131 151 181 191 313 353 373 383 说明 Hint 1: Generate the palindromes and

P1217 [USACO1.5]回文质数 Prime Palindromes(stringstream,sizeof(num)/sizeof(num[0]),打表)

题目描述 因为 151 既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数. 写一个程序来找出范围 [a,b](5≤a<b≤100,000,000)( 一亿)间的所有回文质数. 输入格式 第 1 行: 二个整数 a 和 b . 输出格式 输出一个回文质数的列表,一行一个. 输入输出样例 输入 5 500 输出 5 7 11 101 131 151 181 191 313 353 373 383 说明/提示 Hint 1: Generate the palindr

题解 P1217 【[USACO1.5]回文质数 Prime Palindromes】

蒟蒻对这题的思路很简单,懒得想太多复杂的细节,先打一个O(n)的暴力算法,再一次像下方粘的代码这样输出 freopen("DABIAO.ans","w",stdout); bool a[10010000]; cout<<"a["<<num<<"]=1;"; 其实很多时候,考试的时候,遇到这类的题没有必要想进一切可能,思考,钻研.抑或是觉得自己的代码可能AC不了会TLE或MLE不妨就在自己的电

洛谷P1217回文质数-Prime Palindrome回溯

P1217 [USACO1.5]回文质数 Prime Palindromes 题意:给定一个区间,输出其中的回文质数: 学习了洛谷大佬的回溯写法,感觉自己写回溯的能力不是很强: #include <cstdio> #include <iostream> #include <cmath> const int maxn = 100; using namespace std; int a[maxn],l,r; bool is_prime(int n) //判断素数 { int

洛谷P1206 [USACO1.2]回文平方数 Palindromic Squares

P1206 [USACO1.2]回文平方数 Palindromic Squares 271通过 501提交 题目提供者该用户不存在 标签USACO 难度普及- 提交  讨论  题解 最新讨论 暂时没有讨论 题目描述 回文数是指从左向右念和从右向左念都一样的数.如12321就是一个典型的回文数. 给定一个进制B(2<=B<=20,由十进制表示),输出所有的大于等于1小于等于300(十进制下)且它的平方用B进制表示时是回文数的数.用’A’,’B’……表示10,11等等 输入输出格式 输入格式: 共