題解 AT261 【與えられた數より小さい素數の個數について】
阿新 • • 發佈:2018-03-20
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 【與えられた數より小さい素數の個數について】