你最愿意做的哪件事,才是你的天赋所在

0%

区间素数个数-min_25筛

题目链接

Loj6235

思路

一道Min25筛的很基础的入门题。就是对g函数求和的操作。先对n分块,然后从小到达筛素数,然后从大到小对g进行处理,
因为这样就能滚动处理g数组,少了一维空间

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 316300;
ll a[maxn<<1];
ll prime[maxn],cnt;
ll g[maxn<<1];
ll sqr,id,n;
int Id(ll x){return x<=sqr?x:id-n/x+1;}
int main()
{
scanf("%lld",&n);
ll sn = sqrt(n);
sqr=sn;
for(ll i=1;i<=n;i=a[id]+1)
{
a[++id]=n/(n/i);
g[id]=a[id]-1;
}
for(ll i=1;i<=sn;i++)if(g[i]!=g[i-1])
{
prime[cnt++]=i;
ll sq = 1ll*i*i;
for(ll j=id;a[j]>=sq;j--)
{
g[j]-=g[Id(a[j]/i)]-(cnt-1);
}
}
cout<<g[id]<<endl;
}
你最愿意做的哪件事,才是你的天赋所在
-------------你最愿意做的哪件事才是你的天赋所在-------------