1. 程式人生 > >題解 AT261 【與えられた數より小さい素數の個數について】

題解 AT261 【與えられた數より小さい素數の個數について】

space 分享 true int .org 技術分享 scanf div pda

數據小,這道題可以用暴力的算法,也可以用更加高級一點的素數篩法

暴力做法已經有了,線性篩的算法有了,這裏給出一個簡單一點的但比暴力算法快一點的算法:

#include<bits/stdc++.h>
using namespace std;
bool a[10000010];//合數表
int main()
{
    long long n;
    scanf("%lld",&n);
    for(int i=2;i<=n;i++){
        if(a[i])continue;//如果已經在合數表裏了,相當於下面動圖中有顏色的部分
        for(int j=i;j<=n;j+=i){//如果不滿足,就一定是質數
            if(a[j])continue;
            a[j]=1;//將找到的這個質數的倍數全部上色,即加入合數表
        }
        b[i]=1;
    }
    long long ans=0;
    for(int i=2;i<=n-1;i++){
        if(b[i])ans++;
    }//統計即可
    cout<<ans<<endl;
}

  

就是一個與線性篩極其類似的埃氏算法,可以叫做偽線性篩,它們兩個之間是常數關系

這裏的意思很簡單,通過一個小動圖即可了解

技術分享圖片

在這裏用這個代碼可以直接過P3383。註意:有一個小地方不同。

Update:2018.3.12//補充完善內容

題解 AT261 【與えられた數より小さい素數の個數について】