• poj2689Prime Distance


    这题……一开始没想到 后来

    题意就是求区间素数对最大和最小距离

    发现必须处理所有素数

    复杂度要求是O(n)~O(nlgn)

    考虑分开求质数和合数 其实就是筛法筛合数

    最后遍历一遍找最大最小值即可

    然后这个方法筛素数到R½就可以了

    也就是50000(WA是写的40000……)

    Time cost:55min

    Code:

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 #include<cmath>
     5 #include<queue>
     6 #include<vector>
     7 #define ms(a,b) memset(a,b,sizeof a)
     8 #define rep(i,a,n) for(int i = a;i <= n;i++)
     9 #define per(i,n,a) for(int i = n;i >= a;i--)
    10 #define inf 2147483647
    11 using namespace std;
    12 typedef long long ll;
    13 ll read() {
    14     ll as = 0,fu = 1;
    15     char c = getchar();
    16     while(c < '0' || c > '9') {
    17         if(c == '-') fu = -1;
    18         c = getchar();
    19     }
    20     while(c >= '0' && c <= '9') {
    21         as = as * 10 + c - '0';
    22         c = getchar();
    23     }
    24     return as * fu;
    25 }
    26 const int N = 100005;
    27 //head
    28 ll l,r;
    29 ll mindiv[N],prime[N];
    30 int top;
    31 void initprime(int n) {
    32     rep(i,2,n) {
    33     if(!mindiv[i]) prime[++top] = i;
    34     for(int j = 1;j <= top && i * prime[j] <= n;j++) {
    35         mindiv[prime[j] * i] = prime[j];
    36         if(i % prime[j] == 0) break;
    37     }
    38     }
    39 }
    40 
    41 int flag[N<<4],tot;
    42    
    43 int main() {
    44     initprime(50000);
    45     while(~scanf("%lld%lld",&l,&r)) {
    46     tot++;
    47     if(l == 1) l++;
    48     rep(i,1,top) {
    49         if(prime[i] * prime[i] > r) break;
    50         rep(j,(l+prime[i]-1)/prime[i],r/prime[i]) 
    51         if(j > 1) flag[j * prime[i] - l] = tot;
    52     }
    53     ll minn = 10000007,maxx = 0;
    54     ll minid[2],maxid[2];
    55     ll cur = 0,curr = 0;
    56     rep(i,l,r) {
    57         if(flag[i-l] == tot) continue;
    58         cur = curr,curr = i;
    59         if(!cur) continue;
    60         if(curr - cur < minn) minn = curr - cur,minid[0] = cur,minid[1] = curr;
    61         if(curr - cur > maxx) maxx = curr - cur,maxid[0] = cur,maxid[1] = curr;
    62     }
    63     if(!maxx) puts("There are no adjacent primes.");
    64     else printf("%lld,%lld are closest, %lld,%lld are most distant.
    ",minid[0],minid[1],maxid[0],maxid[1]);
    65     }
    66     return 0;
    67 }
    > 别忘了 总有人在等着你
  • 相关阅读:
    (转载)Bonding技术指南
    Linux配置虚拟地址
    VB6之写注册表
    Tomcat集群搭建
    VBS连接远程Oracle
    机器学习 目标函数,损失函数
    深度学习理解内容 初
    leetcode 39. Combination Sum
    leetcode 33. Search in Rotated Sorted Array
    leetcode 29. Divide Two Integers
  • 原文地址:https://www.cnblogs.com/yuyanjiaB/p/9777684.html
Copyright © 2020-2023  润新知