zoukankan      html  css  js  c++  java
  • vijosP1359 Superprime

    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<<"
    ";
    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 }
  • 相关阅读:
    ios学习Day3xiawu
    ios学习Day3
    linux系统设置回收站
    Linux sort命令的注意点
    markdown文件管理
    PG创建只读用户
    PG游标引用实例
    小狼毫输入法配置双拼输入
    日期相关
    PG数组使用
  • 原文地址:https://www.cnblogs.com/lidaxin/p/4872009.html
Copyright © 2011-2022 走看看