#埃氏筛,欧拉函数#洛谷 3601 签到题

本文介绍了一种解决特定区间内欧拉函数求和问题的方法。通过预处理质数并利用质数计算欧拉函数,该算法能在合理的时间复杂度内解决大范围的数据问题。适用于竞赛编程中涉及欧拉函数的题目。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

∑i=lri−φ(i)\sum_{i=l}^{r}i-\varphi(i)i=lriφ(i)


分析

首先这道题数据范围非常大,杜教筛是不可能的,所以只能用r−l≤106r-l\leq10^6rl106这一条件,那么首先预处理10610^6106以内的质数,然后用这些质数求欧拉函数,对于大质数,当然是用另外一个数组记录下来然后特判,时间复杂度O(106log106)O(10^6log10^6)O(106log106)


代码

#include <cstdio>
#define rr register
using namespace std;
const int N=1000000;
typedef long long ll; int prime[80001],cnt;
ll l,r,phi[N+1],b[N+1],ans; bool v[N+1];
signed main(){
    for (rr int i=2;i<=N;++i)
    if (!v[i]){
    	prime[++cnt]=i;
        for (rr int j=i<<1;j<=N;j+=i)
    	    v[j]=1;
    }
    scanf("%lld%lld",&l,&r);
    for (rr int i=1;i<=r-l+1;++i) phi[i]=b[i]=i+l-1;
    for (rr int i=1;i<=cnt&&prime[i]*prime[i]<=r;++i){
        rr ll L=prime[i]*(l/prime[i]),R=prime[i]*(r/prime[i]);
        for (rr ll j=L;j<=R;j+=prime[i])
        if (j>=l){
            phi[j-l+1]=phi[j-l+1]/prime[i]*(prime[i]-1);
            while (b[j-l+1]%prime[i]==0) b[j-l+1]/=prime[i];
        }
    }
    for (rr int i=1;i<=r-l+1;++i){
        if (b[i]>1) phi[i]=phi[i]/b[i]*(b[i]-1);
        ans=(ans+l+i-1-phi[i])%666623333;
    }
    return !printf("%lld",ans);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值