51nod1238 最小公倍数之和 V3 莫比乌斯函数 杜教筛
题意:求\(\sum_{i = 1}^{n}\sum_{j = 1}^{n}lcm(i, j)\).
题解:虽然网上很多题解说用mu卡不过去,,,不过试了一下貌似时间还挺充足的,。。也许有时间用phi试试?
因为是用的莫比乌斯函数求的,所以推导比大部分题解多。。。而且我写式子一般都比较详细,所以可能看上去很多式子,实际上是因为每一步都写了,几乎没有跳过的。所以应该都可以看懂的。
末尾的\(e\)函数是指的\(e[1] = 1\),\(e[x] = 0(x != 1)\)这样一个函数
$$\sum_{i = 1}^{n}\sum_{j = 1}^{n}lcm(i, j)$$
$$\sum_{i = 1}^{n} \sum_{i = 1}^{n} \frac{ij}{gcd(i, j)}$$
枚举\(gcd\)
$$\sum_{d = 1}^{n} \sum_{i = 1}^{\lfloor {\frac{n}{d}} \rfloor} \sum_{j = 1}^{\lfloor {\frac{n}{d}} \rfloor}[gcd(i, j) == d] \frac{ij}{d}$$
因为\((\frac{ijd^2}{d} = ijd)\),所以:
$$\sum_{d = 1}^{n} \sum_{i = 1}^{\lfloor {\frac{n}{d}} \rfloor} \sum_{j = 1}^{\lfloor {\frac{n}{d}} \rfloor}[gcd(i, j) == d] ijd$$
$$\sum_{d = 1}^{n}d\sum_{i = 1}^{\lfloor {\frac{n}{d}} \rfloor} \sum_{j = 1}^{\lfloor {\frac{n}{d}} \rfloor}ij[gcd(i, j) == 1]$$
$$\sum_{d = 1}^{n} d \sum_{i = 1}^{\lfloor {\frac{n}{d}} \rfloor} \sum_{j = 1}^{\lfloor {\frac{n}{d}} \rfloor} ij \sum_{k | gcd(i, j)} \mu(k)$$
枚举k,再枚举k的倍数。
$$\sum_{d = 1}^{n}d\sum_{k = 1}^{\lfloor {\frac{n}{d}} \rfloor}\mu(k) \sum_{i = 1}^{\lfloor {\frac{n}{dk}} \rfloor}ik \sum_{j = 1}^{\lfloor {\frac{n}{dk}} \rfloor}jk$$
设\(S(n) = \sum_{i = 1}^{n}i\)
$$\sum_{d = 1}^{n}d \sum_{k = 1}^{\lfloor {\frac{n}{d}} \rfloor} \mu(k) k ^ 2 S(\frac{n}{dk})$$
枚举\(T = dk\)
$$\sum_{T = 1}^{n} S(\frac{n}{T})^ 2 \sum_{k | T} \mu(k) k ^ 2 \frac{T}{k}$$
$$\sum_{T = 1}^{n} S(\frac{n}{T})^ 2 \sum_{k | T} \mu(k) kT$$
$$\sum_{T = 1}^{n} S(\frac{n}{k})^ 2 \cdot T \sum_{k | T} \mu(k)k$$
设\(f(T) = T\sum_{k | T} \mu(k) k\),卷上\(id^2\),因为\(S(\frac{n}{k})\)可以数论分块,所以我们只需要快速求出区间\([l, r]\)内的\(f\)之和即可,显然求出\(f\)的前缀和即可解决问题
$$(f * id^2)(n) = \sum_{i |n}f(i) \frac{n2}{i2}=\sum_{i | n}i \sum_{k | i} \mu(k) k \frac{n ^ 2}{i ^ 2}$$
$$\sum_{i | n}\sum_{k | i} \mu(k)k\frac{n ^ 2}{i} = n \sum_{i | n}\sum_{k | i} \mu(k) k \frac{n}{i}$$
设$$h(i) = \sum_{k | i} \mu(k)k$$,则原式:
$$n \sum_{i | n} h(i) \frac{n}{i} = n (h * id)(n)$$
$$(f * id ^ 2)(n) = n (h * id)(n)$$
$$h(n) = \sum_{k | n}\mu(k)k = (\mu \cdot id) * 1$$
$$f * id ^ 2 = n [(\mu \cdot id) * 1 * id] = n[(\mu \cdot id) * id * 1]$$
其中$$(\mu \cdot id) * id = \sum_{i | n} \mu(i) i \frac{n}{i} = n \sum_{i | n}\mu(i) = e$$
所以
$$n[(\mu \cdot id) * id * 1] = n[e * 1] = n$$
带入杜教筛的式子:
$$g(1)S(n) = \sum_{i = 1}^{n} (f * g)(i) - \sum_{i = 2}^{n}g(i)S(\frac{n}{i})$$
$$= \sum_{i = 1}^{n}i - \sum_{i = 2}^{n}i ^ 2 S(\frac{n}{i})$$
然后直接上杜教就可以了.
其实还有一个问题。。。一开始预处理的前缀和怎么求?
要知道前缀和,首先要求出\(f\).
因为\(f(T) = T\sum_{k | T} \mu(k) k\),所以如果我们可以快速求出\(\sum_{k | T}\mu(k)k\),然后就只需要再\(O(n)\)的乘上\(T\)就可以了.
我们先预处理出\(\mu(k)\),然后对于每一个\(k\),枚举它的倍数,统计贡献。那么复杂度为 \(\frac{n}{1} + \frac{n}{2} + ... + \frac{n}{n} = nlogn\)(此处的\(n\)为原题面的\(\frac{2}{3}\)次方,即要预处理的\(f\)个数)
#include<bits/stdc++.h>
using namespace std;
#define R register int
#define LL long long
#define RL register LL
#define AC 3000
#define ac 5000000
#define p 1000000007LL
//#define h(x) ((x <= block) ? sum[x] : S[n / x])
LL n, ans, block;
LL mu[ac], S[AC], sum[ac], inv[AC];
int pri[ac], tot;
bool z[ac], vis[AC];
inline LL h(LL x)
{
return ((x <= block) ? sum[x] : S[n / x]);
}
inline void up(LL & a, LL b)
{
a += b;
if(a >= p) a -= p;
if(a <= -p) a += p;
}
LL count(LL l, LL r){
return (r - l + 1) % p * ((r + l) % p) % p * inv[2] % p;
}
void pre()
{
scanf("%lld", &n), block = pow(n, 0.66666);
mu[1] = 1;
for(R i = 2; i <= block; i ++)
{
if(!z[i]) pri[++ tot] = i, mu[i] = -1;
for(R j = 1; j <= tot; j ++)
{
int now = pri[j];
if(i * now > block) break;
z[i * now] = true;
if(!(i % now)) break;
mu[i * now] = - mu[i];
}
}
inv[1] = 1;
for(R i = 2; i <= 10; i ++) inv[i] = (p - p / i) * inv[p % i] % p;
for(R i = 1; i <= block; i ++)//枚举mu(i)
for(R j = 1; j; j ++)//枚举i的倍数
{
if(j * i > block) break;
up(sum[i * j], mu[i] * i % p);
}
for(R i = 1; i <= block; i ++) sum[i] = sum[i] * i % p;
for(R i = 1; i <= block; i ++) up(sum[i], sum[i - 1]);//算出f数组后还要统计前缀和
}
LL get(LL x)
{
x %= p;
return x * (x + 1) % p * (2 * x + 1) % p * inv[6] % p;
}
void cal(LL x)
{
if(x <= block || vis[n / x]) return ;
LL rnt = count(1, x);
for(RL i = 2, lim, now; i <= x; i = lim + 1)
{
lim = x / (x / i), now = x / i, cal(now);
up(rnt, - ((get(lim) - get(i - 1)) % p * h(now) % p));
}
S[n / x] = rnt, vis[n / x] = true;
}
void work()
{
for(RL i = 1, lim, now, x; i <= n; i = lim + 1)
{
lim = n / (n / i), now = n / i, x = count(1, now);
up(ans, (x % p * x % p * ((h(lim) - h(i - 1)) % p) % p));
}
printf("%lld\n", (ans + p) % p);
}
int main()
{
//freopen("in.in", "r", stdin);
pre();
cal(n);
work();
// fclose(stdin);
return 0;
}
51nod1238 最小公倍数之和 V3 莫比乌斯函数 杜教筛的更多相关文章
- 51Nod.1237.最大公约数之和 V3(莫比乌斯反演 杜教筛 欧拉函数)
题目链接 \(Description\) \(n\leq 10^{10}\),求 \[\sum_{i=1}^n\sum_{j=1}^ngcd(i,j)\ mod\ (1e9+7)\] \(Soluti ...
- 51nod 1244 莫比乌斯函数之和 【莫比乌斯函数+杜教筛】
和bzoj 3944比较像,但是时间卡的更死 设\( f(n)=\sum_{d|n}\mu(d) g(n)=\sum_{i=1}^{n}f(i) s(n)=\sum_{i=1}^{n}\mu(i) \ ...
- 【题解】最大公约数之和 V3 51nod 1237 杜教筛
题目传送门 http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1237 数学题真是做的又爽又痛苦,爽在于只要推出来公式基本上就 ...
- [CSP-S模拟测试]:123567(莫比乌斯函数+杜教筛+数论分块)
题目传送门(内部题92) 输入格式 一个整数$n$. 输出格式 一个答案$ans$. 样例 样例输入: 样例输出: 数据范围与提示 对于$20\%$的数据,$n\leqslant 10^6$. 对于$ ...
- 51nod 1220 约数之和【莫比乌斯反演+杜教筛】
首先由这样一个式子:\( d(ij)=\sum_{p|i}\sum_{q|j}[gcd(p,q)==1]\frac{pj}{q} \)大概感性证明一下吧我不会证 然后开始推: \[ \sum_{i=1 ...
- bzoj 4916: 神犇和蒟蒻【欧拉函数+莫比乌斯函数+杜教筛】
居然扒到了学长出的题 和3944差不多(?),虽然一眼看上去很可怕但是仔细观察发现,对于mu来讲,答案永远是1(对于带平方的,mu值为0,1除外),然后根据欧拉筛的原理,\( \sum_{i=1}^{ ...
- bzoj 3512: DZY Loves Math IV【欧拉函数+莫比乌斯函数+杜教筛】
参考:http://blog.csdn.net/wzf_2000/article/details/54630931 有这样一个显然的结论:当\( |\mu(n)|==1 \)时,\( \phi(nk) ...
- 51nod 1227 平均最小公倍数【欧拉函数+杜教筛】
以后这种题能用phi的就不要用mu-mu往往会带着个ln然后被卡常致死 把题目要求转换为前缀和相减的形式,写出来大概是要求这样一个式子: \[ \sum_{i=1}^{n}\sum_{j=1}^{i} ...
- 51nod1238 最小公倍数之和 V3(莫比乌斯反演)
题意 题目链接 Sol 不想打公式了,最后就是求一个 \(\sum_{i=1}^n ig(\frac{N}{i})\) \(g(i) = \sum_{i=1}^n \phi(i) i^2\) 拉个\( ...
随机推荐
- 解决Extjs有IE下z-index属性的问题
在用Extjs时,有时候,在Google浏览器上面没有任何问题,但是相同的页面在IE下面就会有问题,直接报错,点击中断,进行后可以看到如下的信息: Google里面没这个问题,加一句代码就能解决在窗体 ...
- 怎样安装TortoiseGit
TortoiseGit是基于Windows的Git图形化工具 访问 https://tortoisegit.org/
- axios封装(一)基础配置
axios 是目前流行的Promise网络请求库,在浏览器端他通过 xhr方式创建ajax请求.在node环境下,通过 http 库创建网络请求. axios 提供了丰富的配置,这里讲一讲我在工作中通 ...
- TPO-17 C1 Find materials for an opera paper
TPO-17 C1 Find materials for an opera paper production n. 成果:产品:生产:作品 第 1 段 1.Listen to a conversati ...
- 谈谈你对Java异常处理机制的理解
先谈谈我的理解:异常处理机制可以说是让我们编写的程序运行起来更加的健壮,无论是在程序调试.运行期间发生的异常情况的捕获,都提供的有效的补救动作,任何业务逻辑都会存在异常情况,这时只需要记录这些异常情况 ...
- varnish squid nginx比较
linux运维中,web cache server方案的部署是一个很重要的环节,选择也有很多种比如:varnish.squid.nginx.下面就对当下常用的这几个web cache server做一 ...
- “Hello World!”团队第十四次会议
今天是我们团队“Hello World!”团队召开的第十四次会议.博客内容: 一.会议时间 二.会议地点 三.会议成员 四.会议内容 五.Todo List 六.会议照片 七.燃尽图 一.会议时间 2 ...
- 冲刺ing-3
第三次Scrum冲刺 队员完成的任务 队员 完成任务 吴伟华 分配任务,燃尽图 蔺皓雯 编写博客,美化主界面 蔡晨旸 美化主界面 曾茜 主页面设计 鲁婧楠 服务器建构 杨池宇 服务器建构 成员遇到的问 ...
- C++的反思与总结
博客作业学到的东西: 1.博客作业应该说是从寒假就开始了,因为博客作业,所以我寒假时都不敢玩得太疯狂,毕竟还有博客作业没做呢.有了博客作业,我就从一个连博客是什么都不知道无知少年,开始去了解博客是什么 ...
- Java中的生产者、消费者问题
Java中的生产者.消费者问题描述: 生产者-消费者(producer-consumer)问题, 也称作有界缓冲区(bounded-buffer)问题, 两个进程共享一个公共的固定大小的缓冲区(仓库) ...