zoukankan      html  css  js  c++  java
  • NOIP模拟----pmatrix(线性筛)

    题头

    问题描述】
    根据哥德巴赫猜想(每个不小于 6 的偶数都可以表示为两个奇素数之和),定义
    哥德巴赫矩阵 A 如下:对于正整数对(i,j),若 i+j 为偶数且 i,j 均为奇素数,则 Ai,j = 1,
    否则 Ai,j = 0。现在有若干询问(x1,y1,x2,y2),你需要回答下列式子的值
    【输入】
    第一行一个整数 m
    接下来 m 行,每行四个整数 x1 y1 x2 y2,表示一个询问
    【输出】
    m 行,每行一个整数,表示对应询问的答案
    【输入样例】
    1
    1 1 3 5
    【输出样例】
    2
    30%的数据保证 x2, y2, m ≤ 100
    100%的数据保证 1 ≤ x1 ≤ x2 ≤ 10^6
    ; 1 ≤ y1 ≤ y2 ≤ 10^6
    ; m ≤ 1000

    比较水的题了吧,线性筛统计1e6范围内每个值i前面所有奇素数的数量num [ i ],则

    ans=(num[x2]num[x11])(num[y2]num[y11])

    好吧我这并不是线性筛,复杂度

    O(nloglogn)

    #include<bits/stdc++.h>
    using namespace std;
    inline int read(){
        char ch;
        while((ch=getchar())<'0'||ch>'9'){; }
        int res=ch-'0';
        while((ch=getchar())>='0'&&ch<='9')
        res=res*10+ch-'0';
        return res;
    }
    int num[1000005],m,x,x2,y,y2;
    bool notprime[1000005];
    inline void getprime()
    {
        notprime[1]=true;
        for(int i=2;i<=1000000;i++)
        {
            if(notprime[i])
            continue;
            else
            {
                for(int j=i*2;j<=1000000;j+=i)
                notprime[j]=true;
            }
        }
        for(int i=1;i<=1000000;i++)
        if(!notprime[i]&&i!=2) num[i]=num[i-1]+1;
        else num[i]=num[i-1];
    }
    int main(){
        getprime();
        m=read();
        while(m--)
        {
            x=read(),y=read(),x2=read(),y2=read();
            long long ans=1ll*(num[x2]-num[x-1])*1ll*(num[y2]-num[y-1]);
            cout<<ans<<'
    ';
        }
        return 0;
    }

    回头学一下线性筛和各种乱七八糟的筛法吧

  • 相关阅读:
    hadoop面试
    常用脚本
    1.kafka
    2.flink
    java面试
    Hbase 项目
    linux 2>&1 和 &的意思
    Jetbrains系列产品重置试用方法
    解决GitHub网页githubusercontent地址无法访问问题
    stylus 成熟的写法
  • 原文地址:https://www.cnblogs.com/forever-/p/9736083.html
Copyright © 2011-2022 走看看