zoukankan      html  css  js  c++  java
  • poj2689Prime Distance 素数测试

    朴素素数测试是O(x1/2)的,每一个数都测试下来就炸了

    然而如果全部预处理的话才是做大死,时间空间各种炸(大约有1亿个数)

    所以怎么平衡一下呢?

    其实在预处理的时候可以只处理一半:把21474836471/2内的质数全部预处理出来(这些就是要用的全部质数),然后用这些质数线性筛一筛就能得到正解

    = =

    没了?

    没了。

    还是要吐槽一下数论题目虽然代码、题解都很好写,但我不相信我能在赛场上想到正解。。。

     1 #include <cstdio>
     2 #include <iostream>
     3 #define ma 65536 
     4 using namespace std;
     5 bool b[ma];
     6 int a[ma];
     7 bool f[1000001];
     8 int main()
     9 {
    10     int l,r,j=0;
    11     for(int i=2;i<=ma;i++)
    12     {
    13         if(!b[i])
    14             a[++j]=i;
    15         for(int k=1;k<=j && a[k]*i<=ma;k++)
    16         {
    17             b[a[k]*i]=true;
    18             if(i%a[k]==0)
    19                 break;
    20         }
    21     }
    22     int n=j;
    23     while(~scanf("%d%d",&l,&r))
    24     {
    25         for(int i=0;i<=r-l;i++)
    26             f[i]=true;
    27         for(int i=1;i<=n;i++)
    28             for(int j=max(2,(l-1)/a[i]+1);j<=r/a[i];j++)
    29                 f[a[i]*j-l]=false;
    30         int last=-1;
    31         int min1=-1,min2,max1=-1,max2;
    32         if(l==1)
    33             f[0]=false;
    34         for(int i=0;i<=r-l;i++)
    35         if(f[i])
    36         if(last==-1)
    37             last=i;
    38         else
    39         {
    40             if(min1==-1)
    41             {
    42                 min1=last;
    43                 min2=i;
    44             }
    45             if(i-last<min2-min1)
    46             {
    47                 min1=last;
    48                 min2=i;
    49             }
    50             if(max1==-1)
    51             {
    52                 max1=last;
    53                 max2=i;
    54             }
    55             if(i-last>max2-max1)
    56             {
    57                 max1=last;
    58                 max2=i;
    59             }
    60             last=i;
    61         }
    62         if(max1==-1)
    63             printf("There are no adjacent primes.
    ");
    64         else
    65             printf("%d,%d are closest, %d,%d are most distant.
    ",min1+l,min2+l,max1+l,max2+l);
    66     }
    67     return 0;
    68 }

    其实压一压行可以在30行左右搞定的

  • 相关阅读:
    Mysql如何修改unique key
    centos 编译 安装 protobuf
    EasyNetQ简单使用
    微信发送模板消息
    Python删除开头空格
    代码积累-Common
    sql With(NoLock),With(ReadPast)
    webform 使用log4net配置
    log4net.dll添加报错
    js-小数计算问题
  • 原文地址:https://www.cnblogs.com/wanglichao/p/5682331.html
Copyright © 2011-2022 走看看