[51Nod 1244] - 莫比乌斯函数之和

求∑i=1Nμ(i)\sum_{i=1}^Nμ(i)∑i=1N​μ(i)

开推

∑d∣nμ(d)=[n==1]\sum_{d|n}\mu(d)=[n==1]d∣n∑​μ(d)=[n==1]

移项

μ(d)=[n==1]−∑d∣n,d<nμ(d)∴S(N)=∑i=1Nμ(i)=∑i=1N([i==1]−∑d∣i,d<iμ(d))=1−∑i=1N∑d∣i,d<iμ(d)\mu(d)=[n==1]-\sum_{d|n,d<n}\mu(d)\newline
\therefore S(N)=\sum_{i=1}^Nμ(i)=\sum_{i=1}^N([i==1]-\sum_{d|i,d<i}\mu(d))\newline
=1-\sum_{i=1}^N\sum_{d|i,d&lt;i}\mu(d) \newlineμ(d)=[n==1]−d∣n,d<n∑​μ(d)∴S(N)=i=1∑N​μ(i)=i=1∑N​([i==1]−d∣i,d<i∑​μ(d))=1−i=1∑N​d∣i,d<i∑​μ(d)

此处是杜教筛的精髓,也是整除分块优化的精髓(或者说是转换方法),枚举i是d的多少倍

S(N)=1−∑⌊id⌋=2N∑d=1,1&lt;⌊id⌋⌊N⌊id⌋⌋μ(d)S(N)=1-\sum_{{\lfloor{\frac id}\rfloor} =2}^N\sum_{d=1,1&lt;{\lfloor{\frac id}\rfloor}}^{\lfloor \frac N{\lfloor{\frac id}\rfloor} \rfloor}\mu(d)S(N)=1−⌊di​⌋=2∑N​d=1,1<⌊di​⌋∑⌊⌊di​⌋N​⌋​μ(d)

令k=⌊id⌋k={\lfloor{\frac id}\rfloor}k=⌊di​⌋,则有

S(N)=1−∑k=2N∑d=1⌊Nk⌋μ(d)=1−∑k=2NS(⌊Nk⌋)S(N)=1-\sum_{k=2}^N\sum_{d=1}^{\lfloor \frac Nk\rfloor}\mu(d)
=1-\sum_{k=2}^NS({\lfloor \frac Nk\rfloor})S(N)=1−k=2∑N​d=1∑⌊kN​⌋​μ(d)=1−k=2∑N​S(⌊kN​⌋)

那么就可以用线性筛出前面一部分,再整除分块优化递归处理

杜教筛无预处理的时间复杂度是Θ(n34)\Theta(n^{\frac 34})Θ(n43​)

预处理一定范围内的答案后就能降到Θ(n23)\Theta(n^{\frac 23})Θ(n32​)

然而我们此处并不需要多小的时间复杂度…随便处理一个10710^7107就能过了

AC code
#include <cstdio>
#include <map>
#include <cstring>
#include <algorithm>
using namespace std;
#define LL long long
const int MAXP = 1e7+1; int Prime[MAXP/10], Cnt, mu[MAXP], sum[MAXP];
bool IsnotPrime[MAXP];
map<LL,int>S;
void init(int N)
{
mu[1] = 1;
for(int i = 2; i <= N; ++i)
{
if(!IsnotPrime[i]) Prime[++Cnt] = i, mu[i] = -1;
for(int j = 1; j <= Cnt && i * Prime[j] <= N; ++j)
{
IsnotPrime[i * Prime[j]] = 1;
if(i % Prime[j] == 0) { mu[i * Prime[j]] = 0; break; }
mu[i * Prime[j]] = -mu[i];
}
}
for(int i = 1; i <= N; i++) sum[i] = sum[i-1] + mu[i];
} inline int solve(LL N)
{
if(N < MAXP) return sum[N];
if(S.count(N)) return S[N];//记忆化,其实此处可以Hash或者用
int ret = 1;
for(LL i = 2, j; i <= N; i=j+1)
{
j = N/(N/i);
ret -= (j-i+1) * solve(N/i);
}
return S[N] = ret;
} int main ()
{
LL n, m; init(MAXP-1);
scanf("%lld%lld", &n, &m);
printf("%d\n", solve(m)-solve(n-1));
}

[51Nod 1239] - 欧拉函数之和

求 ∑i=1Nφ(i)\sum_{i=1}^Nφ(i)∑i=1N​φ(i)

开推,有

∑d∣nφ(d)=n
\sum_{d|n}φ(d)=n
d∣n∑​φ(d)=n

移项

φ(n)=n−∑d∣n,d&lt;nφ(d)∴S(N)=∑i=1N(i−∑d∣i,d&lt;iφ(d))=N∗(N+1)2−∑i=1N∑d∣i,d&lt;iφ(d)=N∗(N+1)2−∑⌊id⌋=2N∑d=1⌊N⌊id⌋⌋φ(d)
φ(n)=n-\sum_{d|n,d&lt;n}φ(d)\newline
\therefore S(N)=\sum_{i=1}^N(i-\sum_{d|i,d&lt;i}φ(d))\newline
=\frac{N*(N+1)}2-\sum_{i=1}^N\sum_{d|i,d&lt;i}φ(d)\newline
=\frac{N*(N+1)}2-\sum_{{\lfloor\frac id\rfloor}=2}^N\sum_{d=1}^{{\lfloor\frac N{{\lfloor\frac id\rfloor}}\rfloor}}φ(d)\newlineφ(n)=n−d∣n,d<n∑​φ(d)∴S(N)=i=1∑N​(i−d∣i,d<i∑​φ(d))=2N∗(N+1)​−i=1∑N​d∣i,d<i∑​φ(d)=2N∗(N+1)​−⌊di​⌋=2∑N​d=1∑⌊⌊di​⌋N​⌋​φ(d)

令k=⌊id⌋k={\lfloor{\frac id}\rfloor}k=⌊di​⌋,则有

S(N)=N∗(N+1)2−∑k=2N∑d=1⌊Nk⌋φ(d)=N∗(N+1)2−∑k=2NS(⌊Nk⌋)
S(N)=\frac{N*(N+1)}2-\sum_{k=2}^N\sum_{d=1}^{{\lfloor\frac Nk\rfloor}}φ(d)\newline
=\frac{N*(N+1)}2-\sum_{k=2}^NS({\lfloor\frac Nk\rfloor})\newline
S(N)=2N∗(N+1)​−k=2∑N​d=1∑⌊kN​⌋​φ(d)=2N∗(N+1)​−k=2∑N​S(⌊kN​⌋)

然后…就没有了.像上一道题一样处理就完了

AC Code
#include <cstdio>
#include <map>
#include <cstring>
#include <algorithm>
using namespace std;
#define LL long long
const int MAXP = 5e6 + 1;
const int mod = 1e9 + 7;
const int inv2 = 500000004; int Prime[MAXP/10], Cnt, phi[MAXP];
LL sum_phi[MAXP];
bool IsnotPrime[MAXP]; void init(int N)
{
phi[1] = 1;
for(LL i = 2; i <= N; ++i)
{
if(!IsnotPrime[i]) Prime[++Cnt] = i, phi[i] = i-1;
for(LL j = 1; j <= Cnt && i * Prime[j] <= N; ++j)
{
IsnotPrime[i * Prime[j]] = 1;
if(i % Prime[j] == 0)
{
phi[i * Prime[j]] = phi[i] * Prime[j];
break;
}
phi[i * Prime[j]] = phi[i] * (Prime[j]-1);
}
}
for(int i = 1; i <= N; i++)
sum_phi[i] = ((sum_phi[i-1] + phi[i]) % mod + mod) % mod;
}
map<LL, LL> S_phi;
inline LL solve_phi(LL N)
{
if(N < MAXP) return sum_phi[N];
if(S_phi.count(N)) return S_phi[N];
LL ret = (N%mod + 1) * (N%mod) % mod * inv2 % mod;
for(LL i = 2, j; i <= N; i=j+1)
{
j = N/(N/i);
ret = (ret - (j-i+1) % mod * solve_phi(N/i) % mod) % mod;
}
return S_phi[N] = ((ret + mod) % mod);
}
int main ()
{
init(MAXP-1); LL n;
scanf("%lld", &n);
printf("%lld\n", solve_phi(n));
}

[51Nod 1244] - 莫比乌斯函数之和 & [51Nod 1239] - 欧拉函数之和 (杜教筛板题)的更多相关文章

  1. 51 NOD 1239 欧拉函数之和(杜教筛)

    1239 欧拉函数之和 基准时间限制:3 秒 空间限制:131072 KB 分值: 320 难度:7级算法题 收藏 关注 对正整数n,欧拉函数是小于或等于n的数中与n互质的数的数目.此函数以其首名研究 ...

  2. BZOJ_4802_欧拉函数_MR+pollard rho+欧拉函数

    BZOJ_4802_欧拉函数_MR+pollard rho+欧拉函数 Description 已知N,求phi(N) Input 正整数N.N<=10^18 Output 输出phi(N) Sa ...

  3. 51nod 1239 欧拉函数之和(杜教筛)

    [题目链接] https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1239 [题目大意] 计算欧拉函数的前缀和 [题解] 我们 ...

  4. 51nod 1237 最大公约数之和 V3【欧拉函数||莫比乌斯反演+杜教筛】

    用mu写lcm那道卡常卡成狗(然而最后也没卡过去,于是写一下gcd冷静一下 首先推一下式子 \[ \sum_{i=1}^{n}\sum_{j=1}^{n}gcd(i,j) \] \[ \sum_{i= ...

  5. 51Nod 1239 欧拉函数前n项和 杜教筛

    http://www.51nod.com/Challenge/Problem.html#!#problemId=1239 AC代码 #include <bits/stdc++.h> #de ...

  6. 【51nod】1239 欧拉函数之和 杜教筛

    [题意]给定n,求Σφ(i),n<=10^10. [算法]杜教筛 [题解] 定义$s(n)=\sum_{i=1}^{n}\varphi(i)$ 杜教筛$\sum_{i=1}^{n}(\varph ...

  7. 【51nod】1239 欧拉函数之和

    题解 写完上一道就开始写这个,大体上就是代码改了改而已= = 好吧,再推一下式子! \(\sum_{i = 1}^{n}i = \sum_{i = 1}^{n}\sum_{d | i}\phi(d) ...

  8. 51nod 1239 欧拉函数之和【欧拉函数+杜教筛】

    和bzoj 3944比较像,但是时间卡的更死 设\( f(n)=\sum_{d|n}\phi(d) g(n)=\sum_{i=1}^{n}f(i) s(n)=\sum_{i=1}^{n}\phi(i) ...

  9. 51nod 1238 最小公倍数之和 V3 【欧拉函数+杜教筛】

    首先题目中给出的代码打错了,少了个等于号,应该是 G=0; for(i=1;i<=N;i++) for(j=1;j<=N;j++) { G = (G + lcm(i,j)) % 10000 ...

随机推荐

  1. Burp Suite的安装与使用

    ​ Burp Suite是一个集成化的渗透测试工具,它集合了多种渗透测试组件,使我们自动化地或手工地能更好的完成对web应用的渗透测试和攻击.在渗透测试中,我们使用Burp Suite将使得测试工作变 ...

  2. 机器学习-EM算法笔记

    EM算法也称期望最大化(Expectation-Maximum,简称EM)算法,它是一个基础算法,是很多机器学习领域算法的基础,比如隐式马尔科夫算法(HMM), LDA主题模型的变分推断,混合高斯模型 ...

  3. js复制内容到粘贴板

    点击右边内容:<span onclick="copyContent(this);" title="点击复制">啊,我被复制了</span> ...

  4. THUPC2019/CTS2019/APIO2019/PKUSC2019游记

    THUPC2019/CTS2019/APIO2019/PKUSC2019游记 5.10 中铺,火车好晃啊 5.11 打了THUPC2019的练习赛,华容道好评(四个小兵,杠鸭!) 5.12 打了THU ...

  5. SS L服务

    WebHttpBinding _binding = new WebHttpBinding(); WebServiceHost ws = new WebServiceHost(typeof(Servic ...

  6. springboot接收date类型参数

    springboot接收日期类型参数,实现自动转换. 1. 当请求类型为json,date类型字段为 json 字段时,可以使用如下两种方法 1.1. 当前参数加两个注解(有些文章说接收只需要加 @D ...

  7. 【转载】Sqlserver根据生日计算年龄

    在Sqlserver中,可以根据存储的出生年月字段计算出该用户的当前年龄信息,主要使用到DateDiff函数来实现.DateDiff函数的格式为DATEDIFF(datepart,startdate, ...

  8. 【转载】C#使用Trim方法去除字符串前后的所有空格

    在C#语言程序开发过程中,很多时候需要对字符串对象的前后空格进行去除,此时就需要使用到Trim()方法来实现这个功能,Trim()方法可以快速去除字符串前端和后端的所有空格. 例如有个字符:strin ...

  9. 极度舒适的 Python 入门教程,小猪佩奇也能学会~

    编程几乎已经成为现代人的一门必修课,特别是 Python ,不仅长期霸占编程趋势榜.薪资榜第一,还屡屡进入小学教材,甚至成为浙江省信息技术高考项目-- 今天,小编带来了一门极度舒适的 Python 入 ...

  10. CentOS7.X+LAMP+zabbix4.2环境下搭建Grafana6.1数据库可视化

    1.GrafanaRPM包部署(yum  install  wget) wget https://dl.grafana.com/oss/release/grafana-6.1.4-1.x86_64.r ...