题意

求 $\sum_{i=a}^b \sum_{j=1}^i \frac{lcm(i,j)}{i}$.

分析

只需要求出前缀和,

$$\begin{aligned}
\sum_{i=1}^n \sum_{j=1}^i \frac{lcm(i,j)}{i} &= \sum_{i=1}^n \sum_{j=1}^i \frac{j}{gcd(i,j)} \\
&= \sum_{d=1}^n \sum _{i=1}^n \sum_{j=1}^i \frac{j}{d} \cdot [gcd(i,j)=1] \\
&=  \sum_{d=1}^n \sum_{i=1}^{\left \lfloor \frac{n}{d} \right \rfloor} \sum_{j=1}^i j \cdot [gcd(i,j)=1]
\end{aligned}$$

其后面部分提出来,即求 $\sum_{i=1}^n i\cdot [gcd(i,n)=1]$,对于这种一个值固定的gcd求和有一个套路,即倒序两两配对:

若 $n=1$,和为1;

若 $n>1$,因为 $gcd(i, n) = gcd(n-i, n)$ 且 $\displaystyle  \sum_{i=1}^n i\cdot [gcd(i,n)=1] = \sum_{i=1}^{n-1} i\cdot [gcd(i,n)=1]$,

$\displaystyle \sum_{i=1}^{n-1} i \cdot [gcd(i,n)=1] + \sum_{i=n-1}^1i\cdot [gcd(i,n)=1] = n\varphi (n)$,所以和为 $ n\varphi (n) /2$.

综合得 $\displaystyle \sum_{i=1}^n i\cdot [gcd(i,n)=1] = \frac{n\varphi (n)+[n=1]}{2}$.

具体实现上,$[i=1]$ 只成立 $n$,除2可以提出来,即 原式 = $\displaystyle \frac{1}{2}(\sum_{d=1}^n \sum_{i=1}^{\left \lfloor \frac{n}{d} \right \rfloor} i\varphi (i) + n)$.

现在唯一得问题是如何求 $\displaystyle  S(n) = \sum_{i=1}^n i\varphi (i)$.

根据杜教筛,

设 $\displaystyle S(n) = \sum_{i=1}^n f(i)$,$f(n) = n\varphi (n), \ g(n) = n$.

$\displaystyle f*g = \sum_{d|n} d \varphi (d) \cdot \frac{n}{d} = n\sum_{d|n}\varphi (d) = n^2$.

因此 $\displaystyle S(n) = \sum_{i=1}^n i^2 - \sum_{d=2}^n d\cdot S(\left \lfloor \frac{n}{d} \right \rfloor)$.

再最外层套个数论分块即可。

代码

#include <algorithm>
#include <cstdio>
#include <cstring>
#include <map>
#include<unordered_map>
using namespace std;
const int maxn = ;
typedef long long ll;
const ll mod = ;
const ll inv2 = (mod+)>>;
const ll inv6 = ; //
ll T, a, b, pri[maxn], tot, phi[maxn], sum_phi_d[maxn];
bool vis[maxn];
unordered_map<ll, ll> mp_phi_d; //可换成unordered_map,约快3倍
ll S_phi_d(ll x) {
if (x < maxn) return sum_phi_d[x];
if (mp_phi_d[x]) return mp_phi_d[x];
ll ret = x * (x+) % mod * (*x%mod+) % mod * inv6 % mod; //%敲成*,浪费一个小时
for (ll i = , j; i <= x; i = j + ) {
j = x / (x / i);
ret =(ret - S_phi_d(x / i) * (i+j) % mod * (j-i+) % mod * inv2 % mod + mod) % mod;
}
return mp_phi_d[x] = ret;
}
void initPhi_d()
{
phi[] = ;
for (int i = ; i < maxn; i++) {
if (!vis[i]) pri[++tot] = i, phi[i] = i-;
for (int j = ; j <= tot && i * pri[j] < maxn; j++) {
vis[i * pri[j]] = true;
if (i % pri[j] == )
{
phi[i * pri[j]] = phi[i] * pri[j] % mod;
break;
}
else
{
phi[i * pri[j]] = phi[i] * phi[pri[j]] % mod;
}
}
}
for (int i = ; i < maxn; i++) sum_phi_d[i] = (sum_phi_d[i - ] + phi[i]*i) % mod;
}
ll solve(ll n)
{
ll res = ;
for(ll i = , j;i <= n;i = j+)
{
j = n / (n / i);
res = (res + S_phi_d(n/i) * (j-i+) % mod) % mod;
}
return (res+n)*inv2%mod;
} int main() {
initPhi_d();
scanf("%lld%lld", &a, &b);
printf("%lld\n", (solve(b)-solve(a-)+mod) % mod);
return ;
}

参考链接:

1. https://blog.csdn.net/FromATP/article/details/74999989

2. https://www.cnblogs.com/owenyu/p/7397687.html

[51nod1227]平均最小公倍数(莫比乌斯反演+杜教筛)的更多相关文章

  1. [复习]莫比乌斯反演,杜教筛,min_25筛

    [复习]莫比乌斯反演,杜教筛,min_25筛 莫比乌斯反演 做题的时候的常用形式: \[\begin{aligned}g(n)&=\sum_{n|d}f(d)\\f(n)&=\sum_ ...

  2. 【bzoj3930】[CQOI2015]选数 莫比乌斯反演+杜教筛

    题目描述 我们知道,从区间[L,H](L和H为整数)中选取N个整数,总共有(H-L+1)^N种方案.小z很好奇这样选出的数的最大公约数的规律,他决定对每种方案选出的N个整数都求一次最大公约数,以便进一 ...

  3. [BZOJ 3930] [CQOI 2015]选数(莫比乌斯反演+杜教筛)

    [BZOJ 3930] [CQOI 2015]选数(莫比乌斯反演+杜教筛) 题面 我们知道,从区间\([L,R]\)(L和R为整数)中选取N个整数,总共有\((R-L+1)^N\)种方案.求最大公约数 ...

  4. 51NOD 1222 最小公倍数计数 [莫比乌斯反演 杜教筛]

    1222 最小公倍数计数 题意:求有多少数对\((a,b):a<b\)满足\(lcm(a,b) \in [1, n]\) \(n \le 10^{11}\) 卡内存! 枚举\(gcd, \fra ...

  5. 【CCPC-Wannafly Winter Camp Day3 (Div1) F】小清新数论(莫比乌斯反演+杜教筛)

    点此看题面 大致题意: 让你求出\(\sum_{i=1}^n\sum_{j=1}^n\mu(gcd(i,j))\). 莫比乌斯反演 这种题目,一看就是莫比乌斯反演啊!(连莫比乌斯函数都有) 关于莫比乌 ...

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

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

  7. [HDU 5608]Function(莫比乌斯反演 + 杜教筛)

    题目描述 有N2−3N+2=∑d∣Nf(d)N^2-3N+2=\sum_{d|N} f(d)N2−3N+2=∑d∣N​f(d) 求∑i=1Nf(i)\sum_{i=1}^{N} f(i)∑i=1N​f ...

  8. BSOJ5467 [CSPX2017#3]整数 莫比乌斯反演+杜教筛

    题意简述 给你两个整数\(n\),\(k\),让你求出这个式子 \[ \sum_{a_1=1}^n \sum_{a_2=a_1}^n \sum_{a_3=a_2}^n \cdots \sum_{a_k ...

  9. 洛谷P3768 简单的数学题 莫比乌斯反演+杜教筛

    题意简述 求出这个式子 \[ \sum_{i=1}^n\sum_{j=1}^n ij(i,j) \bmod p \] 做法 先用莫比乌斯反演拆一下式子 \[ \begin{split} \sum_{i ...

随机推荐

  1. git强制合并另一个分支

    New分支和Old分支都修改了同样的部分,有冲突,但是想在Old分之上合并New分支的内容,并且以New分支为主,就是不自己手动解决冲突,碰到冲突,直接以New分支为主. 参考 https://git ...

  2. Java 中 override 和 overload 区别

    问题出现: 即使对于一个经验丰富的开发人员来说,方法重载和方法覆盖的区别都能让他犹豫一下, 对于新手来说,经常容易弄混淆. 有没有比较深入浅出的理解方式,能让人过目不忘,用起来还能有条件反射般的速度呢 ...

  3. golang net之http server

    golang 版本:1.12.9 简单的HTTP服务器代码: package main import ( "net/http" ) type TestHandler struct ...

  4. oracle查看执行计划入门

    基于Oracle的应用系统很多的性能问题都是由应用系统的SQL性能低劣引起的,因此SQL的性能优化非常重要.要分析与优化SQL的性能,一般是通过查看该SQL的执行计划,然后通过执行计划有针对性地对SQ ...

  5. day11——函数名的使用、f格式化、迭代器、递归

    day11 函数名的第一类对象及使用 1.可以当作值被赋值给变量 def func(): print(1) print(func) a = func a() 2.当作元素存放在容器中 def func ...

  6. 2019-11-29-WPF-高速书写-StylusPlugIn-原理

    原文:2019-11-29-WPF-高速书写-StylusPlugIn-原理 title author date CreateTime categories WPF 高速书写 StylusPlugIn ...

  7. [转载].NET Core 轻量级模板引擎 Mustachio

    .NET Core 轻量级模板引擎 Mustachio 晓晨Master 一. 前言 Mustachio 是一款轻量级且强大的模板引擎,可以用在网页渲染.代码生成器等需要模板引擎的场景.我用它是用在配 ...

  8. Java自学-I/O Stream流

    Java的流 Stream 什么是流(Stream),流就是一系列的数据 步骤 1 : 什么是流 当不同的介质之间有数据交互的时候,JAVA就使用流来实现. 数据源可以是文件,还可以是数据库,网络甚至 ...

  9. nginx配置多个TLS证书,以及TLS SNI简介

    背景 原来申请的正式域名备案通过,TLS证书也申请了.之前使用的临时域名和证书作为测试环境使用.于是要在单个ECS主机上配置nginx多个证书和多个域名. 实践 nginx部署多个TLS证书很简单,在 ...

  10. 设计模式之(十一)代理模式(Proxy)

    软件开发行业有一个观点:任务问题都可以添加一个中间层来解决.代理模式也是这个思想下的产物. 首先看下代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问.就是把类委托给另外一个类,用这个类来控 ...