[luogu1829][bzoj2154][国家集训队]Crash的数字表格 / JZPTAB【莫比乌斯反演】
题目描述
今天的数学课上,Crash小朋友学习了最小公倍数(Least Common Multiple)。对于两个正整数a和b,LCM(a, b)表示能同时整除a和b的最小正整数。例如,LCM(6, 8) = 24。
回到家后,Crash还在想着课上学的东西,为了研究最小公倍数,他画了一张NM的表格。每个格子里写了一个数字,其中第i行第j列的那个格子里写着数为LCM(i, j)。一个45的表格如下:
1 2 3 4 5
2 2 6 4 10
3 6 3 12 15
4 4 12 4 20
看着这个表格,Crash想到了很多可以思考的问题。不过他最想解决的问题却是一个十分简单的问题:这个表格中所有数的和是多少。当N和M很大时,Crash就束手无策了,因此他找到了聪明的你用程序帮他解决这个问题。由于最终结果可能会很大,Crash只想知道表格里所有数的和mod20101009的值。
题解
蒟蒻chh来推导一下:
答案要求:
\[\sum^{n}_{i=1}\sum^{m}_{j=1}lcm(i,j)\]
根据小学知识,最小公倍数\(\times\)最大公约数=两个数的乘积。
那么答案就变成了:
\[\sum^{n}_{i=1}\sum^{m}_{j=1}\frac{i\times j}{gcd(i,j)}\]
整除分块枚举最大公约数\(d\),商互质
\[\sum^{n}{i=1} \sum{m}{j=1} \sum_{d|i,d|j,gcd(\frac{i}{d},\frac{j}{d})=1} \frac{i\times j}{d}\]
将这个gcd算式转换:
\[\sum^{n}_{d=1} \times \sum^{\lfloor\frac{n}{d}\rfloor}_{i=1} \sum^{\lfloor\frac{m}{d}\rfloor}_{j=1}[gcd(i,j)=1] \times i \times j\]
在将原来的式子进行简化
\[calc(n,m) = \sum^{n}_{i=1} \sum^{m}_{j=1}[gcd(i,j) = 1] \times i \times j\]
那么我们如果我们能算出\(calc\),那么就可以用数论分块求解。
枚举约数
\[\sum^{n}_{d=1} \sum^{n}_{d|i} \sum^{m}_{d|j} \mu (d) \times i \times j\]
设\(i=i' \times d, j = j' \times d\),代入原式:
\[\sum^{n}_{d=1} \mu(d) \times d ^ 2 \times \sum^{\lfloor \frac{n}{d}\rfloor}_{i=1} \sum^{\lfloor \frac{m}{d}\rfloor}_{j=1} \times i \times j\]
莫比乌斯函数前缀和预处理前一部分答案,后一部分答案我们假设\(calc2(n,m)\)。
那么以上答案又可以用一个数论分块求解。
\[calc2(n,m)=\sum^{n}_{i=1} \sum^{m}_{j=1} \times i \times j = \frac{n \times (n + 1)}{2} \times \frac{m\times (m+1)}{2}\]
以上可以\(O(1)\)计算。
那么我们把我们所有简化的式子代回去就可以了。
附赠大佬证明:
ac代码
#include <bits/stdc++.h>
#define ll long long
#define ms(a, b) memset(a, b, sizeof(a))
#define inf 0x3f3f3f3f
#define mod 20101009
#define N 10000005
using namespace std;
template <typename T>
inline void read(T &x) {
x = 0; T fl = 1;
char ch = 0;
while (ch < '0' || ch > '9') {
if (ch == '-') fl = -1;
ch = getchar();
}
while (ch >= '0' && ch <= '9') {
x = (x << 1) + (x << 3) + (ch ^ 48);
ch = getchar();
}
x *= fl;
}
int n, m, prime_tot;
bool vis[N];
int prime[N], mu[N], sum[N];
void get_mu(int MAXN) {
mu[1] = 1;
prime_tot = 0;
for (int i = 2; i <= MAXN; i ++) {
if (!vis[i]) {
prime[++ prime_tot] = i;
mu[i] = -1;
}
for (int j = 1; j <= prime_tot && prime[j] * i <= MAXN; j ++) {
vis[prime[j] * i] = 1;
if (i % prime[j] == 0) break;
else mu[prime[j] * i] = -mu[i];
}
}
for (int i = 1; i <= MAXN; i ++) {
sum[i] = (sum[i - 1] + 1ll * i * i % mod * (mu[i] + mod)) % mod;
}
}
int calc2(int x, int y) {
return (1ll * x * (x + 1) / 2 % mod) * (1ll * y * (y + 1) / 2 % mod) % mod;
}
int calc(int x, int y) {
int res = 0;
for (int l = 1, r; l <= min(x, y); l = r + 1) {
r = min(x / (x / l), y / (y / l));
res = (res + 1ll * (sum[r] - sum[l - 1] + mod) * calc2(x / l, y / l) % mod) % mod;
}
return res;
}
int main() {
read(n); read(m);
get_mu(min(n, m) + 1);
int ans = 0;
for (int l = 1, r; l <= min(n, m); l = r + 1) {
r = min(n / (n / l), m / (m / l));
ans = (ans + 1ll * (r - l + 1) * (r + l) / 2 % mod * calc(n / l, m / l) % mod) % mod;
}
printf("%d\n", ans);
return 0;
}
[luogu1829][bzoj2154][国家集训队]Crash的数字表格 / JZPTAB【莫比乌斯反演】的更多相关文章
- [Luogu P1829] [国家集训队]Crash的数字表格 / JZPTAB (莫比乌斯反演)
题面 传送门:洛咕 Solution 调到自闭,我好菜啊 为了方便讨论,以下式子\(m>=n\) 为了方便书写,以下式子中的除号均为向下取整 我们来颓柿子吧qwq 显然,题目让我们求: \(\l ...
- 洛谷P1829 [国家集训队]Crash的数字表格 / JZPTAB(莫比乌斯反演)
题目背景 提示:原 P1829 半数集问题 已经迁移至 P1028 数的计算 题目描述 今天的数学课上,Crash小朋友学习了最小公倍数(Least Common Multiple).对于两个正整数a ...
- [国家集训队]Crash的数字表格 / JZPTAB 莫比乌斯反演
---题面--- 题解: $$ans = \sum_{i = 1}^{n}\sum_{j = 1}^{m}{\frac{ij}{gcd(i, j)}}$$ 改成枚举d(设n < m) $$ans ...
- P1829 [国家集训队]Crash的数字表格 / JZPTAB 莫比乌斯反演
又一道...分数和取模次数成正比$qwq$ 求:$\sum_{i=1}^N\sum_{j=1}^Mlcm(i,j)$ 原式 $=\sum_{i=1}^N\sum_{j=1}^M\frac{i*j}{g ...
- luoguP1829 [国家集训队]Crash的数字表格 / JZPTAB(莫比乌斯反演)
题意 注:默认\(n\leqslant m\). 所求即为:\(\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}lcm(i,j)\) 因为\(i*j=\gcd(i, ...
- 洛谷 P1829 [国家集训队]Crash的数字表格 / JZPTAB 解题报告
[国家集训队]Crash的数字表格 / JZPTAB 题意 求\(\sum\limits_{i=1}^n\sum\limits_{j=1}^mlcm(i,j)\),\(n,m\le 10^7\) 鉴于 ...
- 题解-[国家集训队]Crash的数字表格 / JZPTAB
题解-[国家集训队]Crash的数字表格 / JZPTAB 前置知识: 莫比乌斯反演 </> [国家集训队]Crash的数字表格 / JZPTAB 单组测试数据,给定 \(n,m\) ,求 ...
- 【题解】[国家集训队]Crash的数字表格 / JZPTAB
求解\(\sum_{i = 1}^{n}\sum_{j = 1}^{m}lcm\left ( i,j \right )\). 有\(lcm\left ( i,j \right )=\frac{ij}{ ...
- P1829 [国家集训队]Crash的数字表格 / JZPTAB
推式子太快乐啦!虽然我好蠢而且dummy和maomao好巨(划掉) 思路 莫比乌斯反演的题目 首先这题有\(O(\sqrt n)\)的做法但是我没写咕咕咕 然后就是爆推一波式子 \[ \sum_{i= ...
随机推荐
- [您有新的未分配科技点][BZOJ3545&BZOJ3551]克鲁斯卡尔重构树
这次我们来搞一个很新奇的知识点:克鲁斯卡尔重构树.它也是一种图,是克鲁斯卡尔算法求最小生成树的升级版首先看下面一个问题:BZOJ3545 Peaks. 在Bytemountains有N座山峰,每座山峰 ...
- 基于uFUN开发板的心率计(二)动态阈值算法获取心率值
前言 上一篇文章:基于uFUN开发板的心率计(一)DMA方式获取传感器数据,介绍了如何获取PulseSensor心率传感器的电压值,并对硬件电路进行了计算分析.心率计,重要的是要获取到心率值,本篇文章 ...
- python第二周。2019.4.13
1, 我绘制大蟒蛇就是..保存也对着呢,你要是打开文件的话,先闪个黑屏,再闪个白屏..自动退出,然后啥都没了. 我觉得是我代码编错了...再来一遍! 这次到可以,但是这个大蟒蛇好像没有回头... 刚才 ...
- Centos6.9下RocketMQ3.4.6高可用集群部署记录(双主双从+Nameserver+Console)
之前的文章已对RocketMQ做了详细介绍,这里就不再赘述了,下面是本人在测试和生产环境下RocketMQ3.4.6高可用集群的部署手册,在此分享下: 1) 基础环境 ip地址 主机名 角色 192. ...
- MongoDB日常运维操作命令小结
总所周知,MongoDB是一个NoSQL非数据库系统,即一个数据库可以包含多个集合(Collection),每个集合对应于关系数据库中的表:而每个集合中可以存储一组由列标识的记录,列是可以自由定义的, ...
- kvm虚拟化管理平台WebVirtMgr部署-完整记录(1)
公司机房有一台2U的服务器(64G内存,32核),由于近期新增业务比较多,测试机也要新增,服务器资源十分有限.所以打算在这台2U服务器上部署kvm虚拟化,虚出多台VM出来,以应对新的测试需求.当KVM ...
- javascript DOM操作中的insertAdjacentHTML方法
插入HTML内容与文本内容以前用的是innerHTML与innerText方法,今天看到insertAdjacentHTML和 insertAdjacentText两个API,特地学习一下: inse ...
- oracle加注释
COMMENT ON table GC_G_DOC84 IS '行政处罚撤销决定书'; COMMENT ON column GC_G_DOC84.CASEID IS '案件记录ID';
- Sub-Processes and Call Activities
https://www.activiti.org/userguide/#bpmnCallActivity http://www.flowable.org/docs/userguide/index.ht ...
- [CB]IPv6 在中国 - 大规模部署进行中 进展明显
IPv6 在中国 - 大规模部署进行中 进展明显 2019年02月04日 08:21 3078 次阅读 稿源:solidot 0 条评论 中国有着世界上最大的网民人口,但它的 IPv6 普及度却处于世 ...