最重要的一点,g不要看成是函数,而是埃式筛第j轮后的剩下的数的F之和。
1.求区间素数个数。n≤1E11
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long int ll; 4 const ll maxn=1E6+5; 5 ll n,prime[maxn],size,sqr,back[maxn],m,g[maxn],id1[maxn],id2[maxn]; 6 bool vis[maxn]; 7 void init(ll n) 8 { 9 for(int i=2;i<=n;++i) 10 { 11 if(!vis[i])prime[++size]=i; 12 for(int j=1;j<=size&&i*prime[j]<=n;++j) 13 { 14 vis[i*prime[j]]=1; 15 if(i%prime[j]==0)break; 16 } 17 } 18 } 19 void put(ll x,int y) 20 { 21 if(x<=sqr)id1[x]=y; 22 else id2[n/x]=y; 23 } 24 int where(ll x) 25 { 26 if(x<=sqr)return id1[x]; 27 else return id2[n/x]; 28 } 29 int main() 30 { 31 ios::sync_with_stdio(false); 32 cin>>n; 33 sqr=sqrt(n)+1; 34 init(sqr); 35 for(ll i=1,j;i<=n;i=j+1) 36 { 37 back[++m]=n/i; 38 j=n/back[m]; 39 put(n/i,m); 40 g[m]=back[m]-1; 41 } 42 for(int j=1;j<=size;++j) 43 { 44 ll limit=prime[j]*prime[j]; 45 for(int i=1;back[i]>=limit;++i) 46 { 47 int k=where(back[i]/prime[j]); 48 g[i]+=j-1-g[k]; 49 } 50 } 51 cout<<g[1]<<endl; 52 return 0; 53 }
原文地址:https://www.cnblogs.com/GreenDuck/p/10695376.html
时间: 2024-10-09 07:21:27