求解\(\sum_{i = 1}^{n}\sum_{j = 1}^{m}lcm\left ( i,j \right )\)。

有\(lcm\left ( i,j \right )=\frac{ij}{gcd\left ( i,j \right )}\),

所以原本的式子转化为:\(\sum_{i = 1}^{n}\sum_{j = 1}^{m}\frac{ij}{gcd\left ( i,j \right )}\)。

注意到\(i, j\) 均为 \(gcd\left ( i,j \right )\) 的倍数,且原式中有除法不好处理,

所以我们改为枚举\(gcd\left ( i,j \right )\) 的倍数。

有:\(\sum_{d = 1}^{n}  d \sum_{i = 1}^{\frac{n}{d}}\sum_{j = 1}^{\frac{m}{d}}ij\left [ gcd\left ( i,j \right ) = 1 \right]\)。

后面的式子套路的来一发反演:

\(\sum_{d = 1}^{n}  d \sum_{i = 1}^{\frac{n}{d}}\sum_{j = 1}^{\frac{m}{d}}ij\sum_{k|gcd\left ( i,j \right )}\mu \left ( k \right )\)

注意这里面有一个乘积的项,可以理解为是任意数字的两两匹配,即:

\(\sum_{i = 1}^{n}\sum_{j = 1}^{m}ij = \left ( 1 + 2 + ... + n \right )\left ( 1 + 2 + ... + m \right )\)

所以转化为:

\(\sum_{d = 1}^{n}  d \sum_{k = 1}^{\frac{n}{d}} k^{2} * \mu \left ( k \right )sum\left ( \left \lfloor \frac{n}{dk} \right \rfloor \right )sum\left ( \left \lfloor \frac{m}{dk} \right \rfloor \right )\)

依然是套路的改变枚举项为 \(dk\)

\(\sum_{T = 1}^{n}  sum\left ( \left \lfloor \frac{n}{T} \right \rfloor \right )sum\left ( \left \lfloor \frac{m}{T} \right \rfloor \right ) * T \sum_{d|T}d*\mu \left ( d \right )\)

  到这里我们已经实现了第一步:前面的部分可以数论分块\(O\left ( \sqrt{n} \right )\)处理,只要我们能够通过线性筛处理出后面的一部分,这道题目就完成了。为了实现线性筛,我们对于后面部分进行观察。我们令\(F[T] = T * \sum_{d|T}d*\mu \left ( d \right )\) 。

  首先,\(F[i]\)当 \(i\) 为质数时,\(F[i]\) 的值很容易确定为 \(i - i^{2}\)。 注意到它实际上是积性函数。所以在线性筛中若 \(i = x * y\) ,(其中 \(x\) 为 \(i\) 的最小质因子),当 \(y \  mod \ x \neq  0\) 时说明二者互质,则 \(F[i] = F[x] * F[y]\)。

  然后考虑当\(y \  mod \ x =  0\)的情况,这说明这两个部分中均含有最小的质因子。注意因为卷入了一个 \(\mu\),所以有平方因子时的值都不会造成贡献。也就是说取值范围和 \(y\) 仍然是相同的,只不过是系数改变了。所以此时 \(F[i] = F[y] * x \)。然后此题就圆满解决啦~~~

#include <bits/stdc++.h>
using namespace std;
#define maxn 10005000
#define int long long
#define mod 20101009
int n, m, N, maxx = maxn - 1e3;
int tot, pri[maxn], inv2;
int ans, f[maxn];
bitset <maxn> is_prime; int read()
{
int x = , k = ;
char c;
c = getchar();
while(c < '' || c > '') { if(c == '-') k = -; c = getchar(); }
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x * k;
} int qpow(int x, int times)
{
int base = ;
for(; times; times >>= , x = (x * x) % mod)
if(times & ) base = (base * x) % mod;
return base;
}
int Sum(int x) { x %= mod; return ((x * (x + )) % mod * inv2 % mod);} void Get_F()
{
f[] = ;
for(int i = ; i <= maxx; i ++)
{
if(!is_prime[i]) pri[++ tot] = i, f[i] = i * (1ll - i) % mod;
for(int j = ; j <= tot; j ++)
{
int K = i * pri[j]; if(K > maxx) break;
is_prime[K] = ;
if(!(i % pri[j])) { f[K] = f[i] * pri[j] % mod; break; }
else f[K] = f[i] * f[pri[j]] % mod;
}
}
for(int i = ; i <= maxx; i ++) f[i] = (f[i] + f[i - ]) % mod;
} signed main()
{
n = read(), m = read(), N = min(n, m);
maxx = min(n, m); inv2 = qpow(, mod - );
Get_F();
for(int l = , r; l <= N; l = r + )
{
r = min((n / (n / l)), (m / (m / l)));
int ret = Sum(n / l) * Sum(m / l) % mod;
ans = (ans + (ret * (f[r] - f[l - ]) % mod)) % mod;
}
printf("%lld\n", (ans + mod) % mod);
return ;
}

【题解】[国家集训队]Crash的数字表格 / JZPTAB的更多相关文章

  1. 题解-[国家集训队]Crash的数字表格 / JZPTAB

    题解-[国家集训队]Crash的数字表格 / JZPTAB 前置知识: 莫比乌斯反演 </> [国家集训队]Crash的数字表格 / JZPTAB 单组测试数据,给定 \(n,m\) ,求 ...

  2. 洛谷 P1829 [国家集训队]Crash的数字表格 / JZPTAB 解题报告

    [国家集训队]Crash的数字表格 / JZPTAB 题意 求\(\sum\limits_{i=1}^n\sum\limits_{j=1}^mlcm(i,j)\),\(n,m\le 10^7\) 鉴于 ...

  3. [Luogu P1829] [国家集训队]Crash的数字表格 / JZPTAB (莫比乌斯反演)

    题面 传送门:洛咕 Solution 调到自闭,我好菜啊 为了方便讨论,以下式子\(m>=n\) 为了方便书写,以下式子中的除号均为向下取整 我们来颓柿子吧qwq 显然,题目让我们求: \(\l ...

  4. 题解 P1829 【[国家集训队]Crash的数字表格 / JZPTAB】

    题目 我的第一篇莫比乌斯反演题解 兴奋兴奋兴奋 贡献一个本人自己想的思路,你从未看到过的船新思路 [分析] 显然,题目要求求的是 \(\displaystyle Ans=\sum_{i=1}^n\su ...

  5. [luogu1829][bzoj2154][国家集训队]Crash的数字表格 / JZPTAB【莫比乌斯反演】

    传送门:洛谷,bzoj 题目描述 今天的数学课上,Crash小朋友学习了最小公倍数(Least Common Multiple).对于两个正整数a和b,LCM(a, b)表示能同时整除a和b的最小正整 ...

  6. 洛谷P1829 [国家集训队]Crash的数字表格 / JZPTAB(莫比乌斯反演)

    题目背景 提示:原 P1829 半数集问题 已经迁移至 P1028 数的计算 题目描述 今天的数学课上,Crash小朋友学习了最小公倍数(Least Common Multiple).对于两个正整数a ...

  7. [国家集训队]Crash的数字表格 / JZPTAB 莫比乌斯反演

    ---题面--- 题解: $$ans = \sum_{i = 1}^{n}\sum_{j = 1}^{m}{\frac{ij}{gcd(i, j)}}$$ 改成枚举d(设n < m) $$ans ...

  8. P1829 [国家集训队]Crash的数字表格 / JZPTAB

    推式子太快乐啦!虽然我好蠢而且dummy和maomao好巨(划掉) 思路 莫比乌斯反演的题目 首先这题有\(O(\sqrt n)\)的做法但是我没写咕咕咕 然后就是爆推一波式子 \[ \sum_{i= ...

  9. 【[国家集训队]Crash的数字表格 / JZPTAB】

    这道题我们要求的是 \[\sum_{i=1}^N\sum_{j=1}^Mlcm(i,j)\] 总所周知\(lcm\)的性质不如\(gcd\)优雅,但是唯一分解定理告诉我们\(gcd(i,j)\time ...

随机推荐

  1. Yii2.0 游客访问限制(转)

    最近在用Yii2.0做项目,其中需要实现一个功能:没有登录不能访问部分页面,即游客身份访问限制.查了半天资料,终于找到答案.解决方法如下: 在access里,access即访问的意思,其中有个配置项 ...

  2. ssh安装和使用

    1.基础知识 ssh用于远程登陆,linux默认安装了client,如果需要被登陆则需要安装 server 2.安装 apt-get install openssh-server 检查是否安装成功 a ...

  3. Kubernetes-运维指南

    Node隔离与恢复 cat unschedule_node.yaml apiVersion: kind: Node metadata: name: k8s-node-1 labels: kuberne ...

  4. python2.7入门---元组

        这次我们来学习下python中的元组.首先,基础认知点是,Python的元组与列表类似,不同之处在于元组的元素不能修改.元组使用小括号,列表使用方括号.元组创建很简单,只需要在括号中添加元素, ...

  5. php简易实现计划任务

    index.php <?php function ceshi(){ $wan = file_get_contents('./wangt_index.txt',true); $jifen = $w ...

  6. Linux下Expect 完成自动输入密码

    今天要开发一个定时任务,然后加入cron列表中.但是有个问题摆在眼前,脚本的执行中需要输入数据库密码(貌似5.1版本以上不允许在-p后直接加密码,会报错) mysql -u root -p <& ...

  7. html简单的分享功能

    超级简单的分享. 包括:QQ.QQ空间.新浪微博.腾讯微博,微信(只是一个二维码): 1.首先是html代码: (前端我并不太会,一直用的都是bootstrap) <div class=&quo ...

  8. (原)一段看似美丽的for循环,背后又隐藏着什么

    之前很长一段时间,潜心修炼汇编,专门装了一个dos7,慢慢玩到win32汇编,再到linux的AT&A汇编,尝试写mbr的时候期间好几次把centos弄的开不了机,又莫名其妙的修好了,如今最大 ...

  9. eclipse 列编辑

    ALT + SHIFT +A 进入列编辑模式,可以一次性操作多行列. 再次按住 ALT + SHIFT +A 则退出列编辑模式.

  10. 数据库sql命令

    本文为转载,原文地址:http://www.cnblogs.com/cangqiongbingchen/p/4530333.html 1.说明:创建数据库CREATE DATABASE databas ...