求解\(\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. bootstrap实现分页

    bootstrap分页功能 写前端都会面临的一个问题就是分页,如果是纯js分页也是可以的,只是可能代码量比较大,所以今天写一个关于用bootstrap框架分页的例子,希望以后可以帮助到一些对这方面比较 ...

  2. 你知道JQuery中的事件冒泡吗,他是怎么执行的,如何来停止冒泡事件?

    事件冒泡 首先需要知道什么是事件冒泡? 事件冒泡是从里面的往外面开始触发的,就是点击子节点,会向上触发父节点,祖先节点的点击事件 demo: <html xmlns="http://w ...

  3. JS日期去杠,日期转换String转Date

    1.巧妙使用split()和join()替换字符串var str = '2014-05-05';var newstr = str.split('-').join("");split ...

  4. 浅谈css蒙版效果

    我们进网站浏览时经常看到当鼠标悬浮在图片上或者某一个地方时,会出现一层朦胧现象覆盖着悬浮位置,简单的理解为“蒙版效果”.下面简单列举实现过程: HTML: CSS:

  5. Hive优化之谓词下推

    Hive优化之谓词下推 解释 Hive谓词下推(Predicate pushdown) 关系型数据库借鉴而来,关系型数据中谓词下推到外部数据库用以减少数据传输 基本思想:尽可能早的处理表达式 属于逻辑 ...

  6. Python基本数据类型(一)

    我会持续更新.... 字符串类型 字符串定义: 字符串的格式:'字符串', "字符串", """字符串"""字符串一旦被 ...

  7. Scrapy核心组件

    • 引擎(Scrapy)用来处理整个系统的数据流处理, 触发事务(框架核心) • 调度器(Scheduler)用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回. 可以想像成一个UR ...

  8. (数据科学学习手札14)Mean-Shift聚类法简单介绍及Python实现

    不管之前介绍的K-means还是K-medoids聚类,都得事先确定聚类簇的个数,而且肘部法则也并不是万能的,总会遇到难以抉择的情况,而本篇将要介绍的Mean-Shift聚类法就可以自动确定k的个数, ...

  9. 将List中的数据更新到数据库中

    List中有相应的数据,更新到数据库如下: 1.根据关键字查找后删除: foreach (var item in objSelList) { ADDaAn da = db.ADDaAns.Find(i ...

  10. Java:Random函数及其种子的作用

    伪随机(preundorandom):通过算法产生的随机数都是伪随机!! 只有通过真实的随机事件产生的随机数才是真随机!!比如,通过机器的硬件噪声产生随机数.通过大气噪声产生随机数 Random生成的 ...