vijosP1359 Superprime

链接:https://vijos.org/p/1359

【思路】

搜索+数学。

很明显的搜索,依次确定每一个数,用参数sum记录dfs即可。

本题的关键在于如何快速判断大素数。

这里素数的判定用到了一个O(sqrt(n))的筛选+试除法,如下:

1、  构造sqrt(n)以内的素数表与素数筛。

2、  对于询问n如果位于sqrt(n)之内则直接查素数筛。

3、  否则,用素数表中的数依次试除。

【代码】

 1 #include<iostream>
 2 #include<cstring>
 3 #include<vector>
 4 #include<cmath>
 5 using namespace std;
 6
 7 int n,m,N=1;
 8 bool su[10001];
 9 vector<int> primes;
10
11 void get_primes(int n) {
12     memset(su,true,sizeof(su));
13     su[0]=su[1]=false;
14     m=sqrt(N);
15     for(int i=2;i<=m;i++) if(su[i]) {
16         primes.push_back(i);
17         for(int j=i*i;j<=m;j+=i) su[j]=false;  //pause with m
18     }
19 }
20 inline bool is_prime(int x) {
21     if(x<=m) return su[x];
22     int nc=primes.size();
23     for(int i=0;i<nc;i++) if(x%primes[i]==0) return false;
24     return true;
25 }
26
27 void dfs(int d,int sum) {
28     if(d==n) {
29         cout<<sum<<"\n";
30         return ;
31     }
32     for(int i=1;i<=9;i++) {
33         int num=sum*10+i;
34         if(is_prime(num)) dfs(d+1,num);
35     }
36 }
37
38 int main() {
39     cin>>n;
40     for(int i=0;i<n;i++) N *= 10;
41     get_primes(n);
42     dfs(0,0);
43     return 0;
44 }
时间: 2024-11-05 20:31:18

vijosP1359 Superprime的相关文章

洛谷P1218 [USACO1.5]特殊的质数肋骨 Superprime Rib

P1218 [USACO1.5]特殊的质数肋骨 Superprime Rib 284通过 425提交 题目提供者该用户不存在 标签USACO 难度普及- 提交  讨论  题解 最新讨论 超时怎么办? 题目描述 农民约翰的母牛总是产生最好的肋骨.你能通过农民约翰和美国农业部标记在每根肋骨上的数字认出它们.农民约翰确定他卖给买方的是真正的质数肋骨,是因为从右边开始切下肋骨,每次还剩下的肋骨上的数字都组成一个质数,举例来说: 7 3 3 1 全部肋骨上的数字 7331是质数;三根肋骨 733是质数;二

Vijos——1359 Superprime

Superprime 描述 农民约翰的母牛总是生产出最好的肋骨.你能通过农民约翰和美国农业部标记在每根肋骨上的数字认出它们. 农民约翰确定他卖给买方的是真正的质数肋骨,是因为从右边开始切下肋骨,每次还剩下的肋骨上的数字都组成一个质数,举例来说:7 3 3 1全部肋骨上的数字 7331是质数;三根肋骨 733是质数;二根肋骨 73 是质数;当然,最后一根肋骨 7 也是质数. 7331 被叫做长度 4 的特殊质数. 写一个程序对给定的肋骨的数目 N (1<=N<=8),求出所有的特殊质数.数字1不

USACO 1.5.3 SuperPrime Rib

The set of ribs denoted by 7331 is prime; the three ribs 733 are prime; the two ribs 73 are prime, and, of course, the last rib, 7, is prime. The number 7331 is called a superprime of length 4. Write a program that accepts a number N 1 <=N<=8 of rib

Index of super-prime - SGU 116(素数+背包)

题目大意:素数表2,3,5,7,11.....如果一个素数所在的位置还是素数,那么这个素数就是超级素数,比如3在第2位置,那么3就是超级素数.....现在给你一个数,求出来这个数由最少的超级素数的和组成,输出这个超级素数. 分析:因为给的数字并不大,所以直接用完全背包求出来即可. 代码如下: =======================================================================================================

USACO 1.5 Superprime Rib

Superprime Rib Butchering Farmer John's cows always yields the best prime rib. You can tell prime ribs by looking at the digits lovingly stamped across them, one by one, by FJ and the USDA. Farmer John ensures that a purchaser of his prime ribs gets

SGU[116] Index of super-prime

Description 描述 Let P1, P2, … ,PN, … be a sequence of prime numbers. Super-prime number is such a prime number that its current number in prime numbers sequence is a prime number too. For example, 3 is a super-prime number, but 7 is not. Index of supe

[USACO1.5]Superprime Rib

## Superprime Rib 特殊的质数肋骨## [题意] 给定位数n(1≤n≤8),要求找出n位数中的质数,并满足每次将最后一位去掉仍为质数.(如质数7331,733是质数,73是质数,7也是质数) [输入格式] 单独的一行包含 n. [输出格式] 按顺序输出长度为 n 的特殊质数,每行一个. [输入样例] 4 [输出样例] 2333 2339 2393 2399 2939 3119 3137 3733 3739 3793 3797 5939 7193 7331 7333 7393 特别

SGU 116 Index of super-prime 数论+完全背包+输出方案

题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=116 题意好晦涩 给你一个不超过一万的数 问它最少可以用多少个“超级素数”来表示 使“超级素数”之和等于它 如果无法这样表示 输出0 否则 按非降序形式输出方案 数论部分就模板的问题 没什么说的 完全背包方面也很常规 说说[输出方案] 背包九讲的伪码给的是二维dp[]的方法 实际上稍加改动就可以用在一维数组上 用一个rec[]记录dp[]的当前状态是从哪个状态转移而来(即上一个状态) 通过

USACO Section1.5 Superprime Rib 解题报告

sprime解题报告 —— icedream61 博客园(转载请注明出处)------------------------------------------------------------------------------------------------------------------------------------------------[题目] 列出所有N位的超级素数. 所谓超级素数,即指其任意位前缀均为素数.例如7.73.733.7331均为素数,故而7331为超级素数