博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[国家集训队]Crash的数字表格
阅读量:5142 次
发布时间:2019-06-13

本文共 3065 字,大约阅读时间需要 10 分钟。

题意

\(\sum\limits_{i = 1}^N \sum\limits_{j = 1}^M lcm (i, j)\)

Solution

易知,原式

\[\sum\limits_{i = 1}^N \sum\limits_{j = 1}^M \frac{ij}{\gcd (i, j)}\]
枚举 \(\gcd (i, j)\) ,且将 \(d\) 提出来得
\[\sum\limits_{d = 1}^{\min (N, M)} d \sum\limits_{i = 1}^{\left\lfloor\frac{N}{d}\right\rfloor} \sum\limits_{j = 1}^{\left\lfloor\frac{M}{d}\right\rfloor} ij[(i, j) = 1]\]
将公式 \(\sum\limits_{k | n} \mu(k) = [n = 1]\) 代入,得
\[\sum\limits_{d = 1}^{\min (N, M)} d \sum\limits_{i = 1}^{\left\lfloor\frac{N}{d}\right\rfloor} \sum\limits_{j = 1}^{\left\lfloor\frac{M}{d}\right\rfloor} ij \sum\limits_{k | (i, j)} \mu(k)\]
套路枚举 \(k\) ,得
\[\sum\limits_{d = 1}^{\min (N, M)} d \sum\limits_{k = 1}^{\min (\left\lfloor\frac{N}{d}\right\rfloor, \left\lfloor\frac{M}{d}\right\rfloor)} \mu(k) \sum\limits_{i = 1}^{\left\lfloor\frac{N}{d}\right\rfloor} \sum\limits_{j = 1}^{\left\lfloor\frac{M}{d}\right\rfloor} ij [k | (i, j)]\]
那么 \(ij\) 存在贡献时其必定是 \(k\) 的倍数,故
\[\sum\limits_{d = 1}^{\min (N, M)} d \sum\limits_{k = 1}^{\min (\left\lfloor\frac{N}{d}\right\rfloor, \left\lfloor\frac{M}{d}\right\rfloor)} \mu(k) \sum\limits_{ki = 1}^{\left\lfloor\frac{N}{d}\right\rfloor} \sum\limits_{kj = 1}^{\left\lfloor\frac{M}{d}\right\rfloor} k^2 ij\]
\(k\) 提出,得
\[\sum\limits_{d = 1}^{\min (N, M)} d \sum\limits_{k = 1}^{\min (\left\lfloor\frac{N}{d}\right\rfloor, \left\lfloor\frac{M}{d}\right\rfloor)} k^2 \mu(k) ( \sum\limits_{i = 1}^{\left\lfloor\frac{N}{kd}\right\rfloor} i) (\sum\limits_{j = 1}^{\left\lfloor\frac{M}{kd}\right\rfloor} j)\]
那么就可以预处理 \(\sum\limits_{k = 1}^n k^2 \mu(k)\) ,后面的用整除分块就好了

Code

#include 
#include
#include
#define MOD 20101009using namespace std;typedef long long LL;const int MAXN = 1e07 + 10;int prime[MAXN];int vis[MAXN]= {0};int pcnt = 0;int mu[MAXN]= {0};LL sum[MAXN]= {0};const int MAX = 1e07;void prime_Acqu () { mu[1] = 1; for (int i = 2; i <= MAX; i ++) { if (! vis[i]) { prime[++ pcnt] = i; mu[i] = - 1; } for (int j = 1; j <= pcnt && i * prime[j] <= MAX; j ++) { vis[i * prime[j]] = 1; if (! (i % prime[j])) break; mu[i * prime[j]] = - mu[i]; } } for (int i = 1; i <= MAX; i ++) sum[i] = (sum[i - 1] + 1ll * i * 1ll * i % MOD * mu[i] % MOD) % MOD;}int N, M;inline LL calc (int n) { LL fn = (LL) n; return (fn * (fn + 1) >> 1) % MOD;}LL Solve () { LL ans = 0; int limit = min (N, M); for (int d = 1; d <= limit; d ++) { LL total = 0; int minlim = min (N / d, M / d); for (int l = 1, r; l <= minlim; l = r + 1) { r = min ((N / d) / ((N / d) / l), (M / d) / ((M / d) / l)); total = (total + (sum[r] - sum[l - 1] + MOD) % MOD * calc (N / d / l) % MOD * calc (M / d / l) % MOD) % MOD; } ans = (ans + (LL) (d) * total % MOD) % MOD; } return ans;}int main () { prime_Acqu (); scanf ("%d%d", & N, & M); LL ans = Solve (); cout << ans << endl; return 0;}/*4 5*/

转载于:https://www.cnblogs.com/Colythme/p/10275893.html

你可能感兴趣的文章
夜太美---酒不醉--人自醉
查看>>
Java学习 · 初识 面向对象深入一
查看>>
zabbix经常报警elasticsearch节点TCP连接数过高问题
查看>>
源代码如何管理
查看>>
vue怎么将一个组件引入另一个组件?
查看>>
多线程学习笔记三之ReentrantLock与AQS实现分析
查看>>
【转】进程与线程的一个简单解释
查看>>
getopt,getoptlong学习
查看>>
数据的传递 变量与参数的使用
查看>>
Razor项目所感(上)
查看>>
移动互联网服务客户端开发技巧系列
查看>>
《Spring》(十五)---@AspectJ
查看>>
使用visio 2010建立sql server数据模型——手动画、利用逆向工程
查看>>
篮球赛
查看>>
HihoCoder - 1339 Dice Possibility(概率dp)
查看>>
js中call、apply、bind的用法
查看>>
WPF DatePicker只显示年和月 修改:可以只显示年
查看>>
DNS扫盲系列之一:有关公网DNS
查看>>
【03】 代理的意义
查看>>
java 观察者模式
查看>>