zoukankan      html  css  js  c++  java
  • poj 2689 Prime Distance (素数二次筛法)

    2689 -- Prime Distance

      没怎么研究过数论,还是今天才知道有素数二次筛法这样的东西。

      题意是,要求求出给定区间内相邻两个素数的最大和最小差。

      二次筛法的意思其实就是先将1~sqrt(b)内的素数先筛出来,然后再对[a,b]区间用那些筛出来的素数再次线性筛。

    代码如下:

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <algorithm>
     4 #include <iostream>
     5 
     6 using namespace std;
     7 
     8 const int N = 66666;
     9 int prm[N >> 3], pn;
    10 bool np[N];
    11 
    12 void getbase() {
    13     np[pn = 0] = np[1] = true;
    14     prm[pn++] = 2;
    15     for (int i = 3; i < N; i++, i++) {
    16         if (!np[i]) prm[pn++] = i;
    17         for (int j = 0, tmp; j < pn; j++) {
    18             tmp = i * prm[j];
    19             if (tmp >= N) break;
    20             np[tmp] = true;
    21             if (i % prm[j] == 0) break;
    22         }
    23     }
    24 //    cout << pn << endl;
    25 //    for (int i = 0; i < 10; i++) cout << prm[i] << endl;
    26 }
    27 
    28 bool mk[1111111];
    29 
    30 int main() {
    31 //    freopen("in", "r", stdin);
    32     getbase();
    33     int T;
    34     long long a, b;
    35     while (~scanf("%lld%lld", &a, &b)) {
    36         a = max(2ll, a);
    37         memset(mk, 0, sizeof(mk));
    38         for (int i = 0; i < pn && prm[i] <= b; i++) {
    39             long long t = a / prm[i] * prm[i];
    40             if (t != a) t += prm[i];
    41             t = max(t, (long long) prm[i] << 1);
    42             for ( ; t <= b; t += prm[i]) mk[t - a] = true;
    43         }
    44         long long p = a;
    45         int mini = 1111111, maxi = -1111111, minp, maxp;
    46         while (p <= b && mk[p - a]) p++;
    47         for (long long i = p + 1; i <= b; i++) {
    48             if (mk[i - a]) continue;
    49 //            cout << i << endl;
    50             if (maxi < i - p) maxi = i - p, maxp = p;
    51             if (mini > i - p) mini = i - p, minp = p;
    52             p = i;
    53         }
    54         if (maxi < 0) puts("There are no adjacent primes.");
    55         else printf("%d,%d are closest, %d,%d are most distant.
    ", minp, minp + mini, maxp, maxp + maxi);
    56     }
    57     return 0;
    58 }
    View Code

    ——written by Lyon

  • 相关阅读:
    HDU 1584 蜘蛛牌(DFS)
    HDU 1800 Flying to the Mars(贪心)
    zsh: command not found: java (xxx)
    Deepin20安装Mysql8
    Deepin全局菜单
    Ubuntu PPA 解读
    Node安装与配置
    Windows安装配置Maven
    idea 安装 Vue 插件没有Vue component选项
    Linux桌面系统创建应用程序快捷方式
  • 原文地址:https://www.cnblogs.com/LyonLys/p/poj_2689_Lyon.html
Copyright © 2011-2022 走看看