题目
https://uoj.ac/problem/188
求
∑
i
=
l
r
f
(
i
)
\sum_{i=l}^{r}f(i)
i=l∑rf(i)
f
(
i
)
f(i)
f(i)是
i
i
i的次大质因子(重复的也考虑),比如
18
18
18的次大质因子是
3
3
3,如果是素数或
1
1
1,则为
0
0
0。
l
+
r
≤
1
0
11
l+r\le 10^{11}
l+r≤1011
思路
考虑
M
i
n
25
Min25
Min25筛时的
S
S
S函数的
d
p
dp
dp,素数部分贡献是
0
0
0,则只有合数的贡献
S
(
n
,
j
)
=
∑
i
=
j
+
1
π
(
n
)
∑
e
=
1
p
i
e
≤
n
(
f
(
p
i
e
)
[
e
>
1
]
+
∑
k
=
2
⌊
n
p
i
e
⌋
f
(
p
i
e
k
)
[
m
i
n
p
(
k
)
>
p
i
]
)
\begin{aligned} S(n,j)&=\sum_{i=j+1}^{\pi(\sqrt{n})}\sum_{e=1}^{p_i^e\le n}\Big(f(p_i^e)[e>1]+\sum_{k=2}^{\lfloor\frac{n}{p_i^e}\rfloor}f(p_i^ek)[minp(k)>p_i]\Big)\\ \end{aligned}
S(n,j)=i=j+1∑π(n)e=1∑pie≤n(f(pie)[e>1]+k=2∑⌊pien⌋f(piek)[minp(k)>pi])
把后面的
k
k
k分成合数和素数,如果
k
k
k是素数,则
f
(
p
i
e
k
)
=
p
i
f(p_i^ek)=p_i
f(piek)=pi,否则
f
(
p
i
e
k
)
=
f
(
k
)
f(p_i^ek)=f(k)
f(piek)=f(k),于是有
∑
k
=
2
⌊
n
p
i
e
⌋
f
(
p
i
e
k
)
[
m
i
n
p
(
k
)
>
p
i
]
=
p
i
∑
q
=
i
+
1
p
q
≤
⌊
n
p
i
e
⌋
1
+
∑
k
=
2
⌊
n
p
i
e
⌋
f
(
k
)
[
m
i
n
p
(
k
)
>
p
i
且
k
∉
P
]
=
p
i
∑
q
=
i
+
1
p
q
≤
⌊
n
p
i
e
⌋
1
+
S
(
⌊
n
p
i
e
⌋
,
i
)
\begin{aligned} &\sum_{k=2}^{\lfloor\frac{n}{p_i^e}\rfloor}f(p_i^ek)[minp(k)>p_i]\\ =&p_i\sum_{q=i+1}^{p_q\le \lfloor\frac{n}{p_i^e}\rfloor}1+\sum_{k=2}^{\lfloor\frac{n}{p_i^e}\rfloor}f(k)[minp(k)>p_i且k\notin \mathbb{P}]\\ =&p_i\sum_{q=i+1}^{p_q\le \lfloor\frac{n}{p_i^e}\rfloor}1+S(\lfloor\frac{n}{p_i^e}\rfloor,i) \end{aligned}
==k=2∑⌊pien⌋f(piek)[minp(k)>pi]piq=i+1∑pq≤⌊pien⌋1+k=2∑⌊pien⌋f(k)[minp(k)>pi且k∈/P]piq=i+1∑pq≤⌊pien⌋1+S(⌊pien⌋,i)
后面式子成立是因为
S
S
S函数素数贡献为
0
0
0,只要考虑合数。综上
S
(
n
,
j
)
=
∑
i
=
j
+
1
π
(
n
)
∑
e
=
1
p
i
e
≤
n
(
f
(
p
i
e
)
[
e
>
1
]
+
p
i
∑
q
=
i
+
1
p
q
≤
⌊
n
p
i
e
⌋
1
+
S
(
⌊
n
p
i
e
⌋
,
i
)
)
S(n,j)=\sum_{i=j+1}^{\pi(\sqrt{n})}\sum_{e=1}^{p_i^e\le n}\Big(f(p_i^e)[e>1]+p_i\sum_{q=i+1}^{p_q\le \lfloor\frac{n}{p_i^e}\rfloor}1+S(\lfloor\frac{n}{p_i^e}\rfloor,i)\Big)
S(n,j)=i=j+1∑π(n)e=1∑pie≤n(f(pie)[e>1]+piq=i+1∑pq≤⌊pien⌋1+S(⌊pien⌋,i))
∑
q
=
i
+
1
p
q
≤
⌊
n
p
i
e
⌋
1
\sum_{q=i+1}^{p_q\le \lfloor\frac{n}{p_i^e}\rfloor}1
∑q=i+1pq≤⌊pien⌋1这个再用
g
g
g函数算就行,注意先讨论上下界的大小关系,因为上下界并不严格。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=3000009;
int isp[N],tot,cnt,sqr;
ll psum[N],psum1[N];
ll g[N],g1[N];
ll l,r,prime[N];
ll w[N];
ll id[N],id1[N];
ll ans,ans1;
ll calsum(ll x){
return x-1;
}
ll calsum1(ll x){
return 0;
}
ll cal(ll x){
return 1;
}
ll cal1(ll x){
return 0;
}
ll S(ll x,int y,ll n){
if(prime[y]>=x)return 0;
ll res=0;
for(int i=y+1;i<=tot&&prime[i]*prime[i]<=x;i++){
ll tmp=prime[i];
for(int e=1;tmp<=x;e++,tmp*=prime[i]){
int locate=x/tmp<=sqr?id[x/tmp]:id1[n/(x/tmp)];
res=(res+prime[i]*((e>1)+((g[locate]-psum[i])<0?0:(g[locate]-psum[i])))+S(x/tmp,i,n));
}
}
return res;
}
void solve(ll n,ll &ans){
sqr=sqrt(n);
isp[1]=1;
tot=cnt=0;
psum[0]=psum1[0]=g[0]=g1[0]=0;
for(int i=2;i<=sqr;i++){
if(!isp[i])
prime[++tot]=i;
for(int j=1;j<=tot&&i*prime[j]<=sqr;j++){
isp[i*prime[j]]=1;
if(i%prime[j]==0)
break;
}
}
for(int i=1;i<=tot;i++)
psum[i]=(psum[i-1]+cal(prime[i])),psum1[i]=(psum1[i-1]+cal1(prime[i]));
for(ll l=1,r;l<=n;l=r+1){
r=n/(n/l);
ll tmp=n/l;
w[++cnt]=tmp;
g[cnt]=calsum(tmp);
g1[cnt]=calsum1(tmp);
if(tmp<=sqr)
id[tmp]=cnt;
else
id1[n/tmp]=cnt;
}
for(int i=1;i<=tot;i++){
for(int j=1;j<=cnt&&prime[i]*prime[i]<=w[j];j++){
ll tmp=w[j]/prime[i];
int locate=tmp<=sqr?id[tmp]:id1[n/tmp];
g[j]=(g[j]-cal(prime[i])*(g[locate]-psum[i-1]));
g1[j]=(g1[j]-cal1(prime[i])*(g1[locate]-psum1[i-1]));
}
}
ans=S(n,0,n);
}
int main(){
cin>>l>>r;
solve(l-1,ans);
solve(r,ans1);
cout<<ans1-ans;
return 0;
}