Sanrd

题目
https://uoj.ac/problem/188

∑ i = l r f ( i ) \sum_{i=l}^{r}f(i) i=lrf(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+r1011

思路
考虑 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=1pien(f(pie)[e>1]+k=2pienf(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=2pienf(piek)[minp(k)>pi]piq=i+1pqpien1+k=2pienf(k)[minp(k)>pik/P]piq=i+1pqpien1+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=1pien(f(pie)[e>1]+piq=i+1pqpien1+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+1pqpien1这个再用 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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值