Crash的数字表格

今天的数学课上,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只想知道表格里所有数的和mod 20101009的值。

Input

输入的第一行包含两个正整数,分别表示N和M。

Output

输出一个正整数,表示表格中所有数的和mod 20101009的值。

Sample Input

4 5

Sample Output

122

【数据规模和约定】

100%的数据满足N, M ≤ 10^7。

题解

n < m
Ans=∑i=1n∑j=1mlcm(i,j)=∑i=1n∑j=1mijgcd(i,j)=∑d=1n∑i=1n∑j=1mijd[gcd(i,j)==d]=∑d=1n∑i=1n/d∑j=1m/dijd[gcd(i,j)==1]=∑d=1nd∑i=1n/d∑j=1m/dij[gcd(i,j)==1]令:Sum(n,m)=∑i=1n∑j=1mijf(x)=∑i=1n∑j=1mij[gcd(i,j)==x]g(x)=∑i=1n∑j=1mij[x∣gcd(i,j)]=x2∑i=1n/x∑j=1m/xij[1∣gcd(i,j)]=∑x∣dnf(d)则:f(x)=∑x∣dnμ(dx)g(d)f(1)=∑d=1nμ(d)d2Sum(nd,md)Ans=∑d=1nd∑i=1n/d∑j=1m/dij[gcd(i,j)==1]=∑d=1nd∑i=1n/dμ(i)i2Sum(nid,mid)\begin{aligned} Ans &amp;= {\sum_{i=1}^{n}\sum_{j=1}^{m}lcm(i,j)}\\ &amp;={\sum_{i=1}^{n}\sum_{j=1}^{m}\frac{ij}{gcd(i,j)}}\\ &amp;={\sum_{d=1}^{n}\sum_{i=1}^{n}\sum_{j=1}^{m}\frac{ij}{d}[gcd(i, j)==d]}\\ &amp;={\sum_{d=1}^{n}\sum_{i=1}^{n/d}\sum_{j=1}^{m/d}{ijd}[gcd(i, j)==1]}\\ &amp;={\sum_{d=1}^{n}d\sum_{i=1}^{n/d}\sum_{j=1}^{m/d}{ij}[gcd(i, j)==1]}\\ 令:Sum(n,m) &amp;={\sum_{i=1}^{n}\sum_{j=1}^{m}ij}\\ f(x) &amp;= {\sum_{i=1}^{n}\sum_{j=1}^{m}ij[gcd(i,j)==x]}\\ g(x)&amp;={\sum_{i=1}^{n}\sum_{j=1}^{m}ij[x|gcd(i,j)]}\\ &amp;={x^2\sum_{i=1}^{n/x}\sum_{j=1}^{m/x}ij[1|gcd(i,j)]}\\ &amp;={\sum_{x|d}^{n}f(d)}\\ 则:f(x)&amp;={\sum_{x|d}^{n}\mu(\frac{d}{x})g(d)}\\ f(1)&amp;={\sum_{d=1}^{n}\mu(d)d^2{Sum(\frac{n}{d},\frac{m}{d})}}\\ Ans &amp;={\sum_{d=1}^{n}d\sum_{i=1}^{n/d}\sum_{j=1}^{m/d}{ij}[gcd(i, j)==1]}\\ &amp;=\sum_{d=1}^{n}d{\sum_{i=1}^{n/d}\mu(i)i^2{Sum(\frac{n}{id},\frac{m}{id})}}\\ \end{aligned} Ans令:Sum(n,m)f(x)g(x)则:f(x)f(1)Ans​=i=1∑n​j=1∑m​lcm(i,j)=i=1∑n​j=1∑m​gcd(i,j)ij​=d=1∑n​i=1∑n​j=1∑m​dij​[gcd(i,j)==d]=d=1∑n​i=1∑n/d​j=1∑m/d​ijd[gcd(i,j)==1]=d=1∑n​di=1∑n/d​j=1∑m/d​ij[gcd(i,j)==1]=i=1∑n​j=1∑m​ij=i=1∑n​j=1∑m​ij[gcd(i,j)==x]=i=1∑n​j=1∑m​ij[x∣gcd(i,j)]=x2i=1∑n/x​j=1∑m/x​ij[1∣gcd(i,j)]=x∣d∑n​f(d)=x∣d∑n​μ(xd​)g(d)=d=1∑n​μ(d)d2Sum(dn​,dm​)=d=1∑n​di=1∑n/d​j=1∑m/d​ij[gcd(i,j)==1]=d=1∑n​di=1∑n/d​μ(i)i2Sum(idn​,idm​)​

  • μ(i)i2\mu(i)i^2μ(i)i2用前缀和预处理
    求f(x}的时候用分块可以在n{\sqrt{n}}n​完成
    求Sum(x,y)的时候用分块也可以在n{\sqrt{n}}n​完成
    所以一次询问可以在O(n)的时间解决
  • 如果是多次询问(10000次询问)
    需要继续化简
    令T=id,考虑对T进行分块Ans=∑d=1nd∑i=1n/dμ(i)i2Sum(nT,mT)=∑T=1nSum(nT,mT)∑i∣Tnμ(i)i2Ti\begin{aligned} 令T&amp;=id,考虑对T进行分块\\ Ans &amp;=\sum_{d=1}^{n}d{\sum_{i=1}^{n/d}\mu(i)i^2{Sum(\frac{n}{T},\frac{m}{T})}}\\ &amp;={\sum_{T=1}^{n}Sum(\frac{n}{T}, \frac{m}{T})\sum_{i|T}^{n}\mu(i)i^2\frac{T}{i}} \end{aligned} 令TAns​=id,考虑对T进行分块=d=1∑n​di=1∑n/d​μ(i)i2Sum(Tn​,Tm​)=T=1∑n​Sum(Tn​,Tm​)i∣T∑n​μ(i)i2iT​​
  • ∑i∣Tnμ(i)i2Ti\sum_{i|T}^{n}\mu(i)i^2\frac{T}{i}∑i∣Tn​μ(i)i2iT​是积性函数可以用线性筛预处理,令t = i × prime[j]
    • 线性筛的时候如果i % prime[j] = 0,则t对应的莫比乌斯函数为0,prime[j]的贡献为g[i] * prime[j]
    • i % prime[j] != 0,符合积形函数直接相乘
    • i 为素数,g[i]=i−i2g[i] = i - i^2g[i]=i−i2
      Sum(x,y)可以在n\sqrt{n}n​完成
// 单次询问 O(n)
#include <bits/stdc++.h>
#define LL  long long
#define P pair<int, int>
#define lowbit(x) (x & -x)
#define mem(a, b) memset(a, b, sizeof(a))
#define rep(i, a, n) for (int i = a; i <= n; ++i)
#define maxn 10000006
#define mid ((l + r) >> 1)
#define lc rt<<1
#define rc rt<<1|1
using namespace std;int mod = 20101009;
int mo[maxn], prime[maxn], g[maxn];
bool vis[maxn];
int Sum(int x) {return (1ll * (1 + x) * x / 2) % mod;
}
void init() {mo[1] = 1;vis[1] = 1;int len = 0;for (int i = 2; i < maxn; ++i) {if (!vis[i]) {prime[len++] = i;mo[i] = -1;}for (int j = 0; j < len && 1ll * i * prime[j] < maxn; ++j) {int t = i * prime[j];vis[t] = 1;if (i % prime[j] == 0) {mo[t] = 0;break;}mo[t] = -mo[i];}}
}int solve(int n, int m) {int i = 1, j;int sum = 0;while (i <= n) {j = min(n / (n/i), m / (m/i));sum += (1ll * (g[j] - g[i-1]) * Sum(n/i) % mod) * Sum(m/i) % mod;sum %= mod;i = j + 1;}return sum;
}int main() {#ifndef ONLINE_JUDGE// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);
#endifinit();for (int i = 1; i < maxn; ++i) {g[i] = 1ll * i * i * mo[i] % mod;g[i] = (g[i] + g[i-1]) % mod;}int n, m;scanf("%d %d", &n, &m);if (n > m)    swap(n, m);int i = 1, j;int ans = 0;while (i <= n) {j = min(n/(n/i), m/(m/i));int t = 1ll * (i + j) * (j - i + 1) / 2 % mod;ans += 1ll * solve(n/i, m/i) * t % mod;ans %= mod;i = j + 1;}printf("%d\n", (ans + mod) % mod);return 0;}
// 单次询问O(sqrt(n))
#include <bits/stdc++.h>
#define LL  long long
#define P pair<int, int>
#define lowbit(x) (x & -x)
#define mem(a, b) memset(a, b, sizeof(a))
#define rep(i, a, n) for (int i = a; i <= n; ++i)
#define maxn 10000006
#define mid ((l + r) >> 1)
#define lc rt<<1
#define rc rt<<1|1
using namespace std;int mod = 20101009;
int mo[maxn], prime[maxn], g[maxn];
bool vis[maxn];
int Sum(int x) {return (1ll * (1 + x) * x / 2) % mod;
}
void init() {// mo[1] = 1;g[1] = 1;vis[1] = 1;int len = 0;for (int i = 2; i < maxn; ++i) {if (!vis[i]) {prime[len++] = i;// mo[i] = -1;g[i] = (i - 1ll * i * i % mod) % mod;}for (int j = 0; j < len && 1ll * i * prime[j] < maxn; ++j) {int t = i * prime[j];vis[i * prime[j]] = 1;if (i % prime[j] == 0) {// mo[t] = 0;g[t] = 1ll * g[i] * prime[j] % mod;break;}// mo[t] = -mo[i];g[t] = 1ll * g[i] * g[prime[j]] % mod;}}for (int i = 2; i < maxn; ++i) {g[i] = (g[i] + g[i-1]) % mod;}
}int main() {#ifndef ONLINE_JUDGE// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);
#endifinit();int n, m;scanf("%d %d", &n, &m);if (n > m)    swap(n, m);int i = 1, j;int ans = 0;while (i <= n) {j = min(n/(n/i), m/(m/i));ans += (1ll * Sum(n/i) * Sum(m/i) % mod) * (g[j] - g[i-1]) % mod;ans %= mod;i = j + 1;}printf("%d\n", (ans + mod) % mod);return 0;
}

BZOJ 2154 Crash的数字表格 (莫比乌斯反演)相关推荐

  1. 【BZOJ2154】Crash的数字表格 [莫比乌斯反演]

    Crash的数字表格 Time Limit: 20 Sec  Memory Limit: 259 MB [Submit][Status][Discuss] Description 今天的数学课上,Cr ...

  2. 【bzoj2154】Crash的数字表格 莫比乌斯反演

    题目描述 今天的数学课上,Crash小朋友学习了最小公倍数(Least Common Multiple).对于两个正整数a和b,LCM(a, b)表示能同时被a和b整除的最小正整数.例如,LCM(6, ...

  3. 洛谷 - P1829 - Crash的数字表格 - 莫比乌斯反演

    求: \(S(n,m)=\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}lcm(i,j)\) 显然: \(S(n,m)=\sum\limits_{i=1}^{n}\ ...

  4. [BZOJ2154]Crash的数字表格 莫比乌斯反演

    orz PoPoQQQ 课件上的例题啊orzorz 话说这种根号划分的方法好像次次都有的样子orzorz http://wenku.baidu.com/link?url=RRtdDApIUqzKmUD ...

  5. 【BZOJ】【2154】Crash的数字表格

    莫比乌斯反演 PoPoQQQ讲义第4题 题解:http://www.cnblogs.com/jianglangcaijin/archive/2013/11/27/3446169.html 感觉两次sq ...

  6. bzoj2154: Crash的数字表格

    好神的莫比乌斯函数然后O(sqrt(n)*sqrt(n))好神的优化啊. #include<cstdio> #include<cstring> #include<ccty ...

  7. bzoj2154 Crash的数字表格

    2154: Crash的数字表格 Time Limit: 20 Sec  Memory Limit: 259 MB Submit: 4549  Solved: 1643 [Submit][Status ...

  8. BZOJ 2154 [国家集训队]Crash的数字表格 / JZPTAB(莫比乌斯反演,经典好题)(Luogu P1829)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 P1829 [国家集训队]Crash的数字表格 / JZPTAB(反演,经典好题) Problem S ...

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

    [国家集训队]Crash的数字表格 / JZPTAB 题目描述 今天的数学课上,Crash 小朋友学习了最小公倍数(Least Common Multiple).对于两个正整数 a a a 和 b b ...

最新文章

  1. R假设检验之k-s检验(KOLMOGOROV AND SMIRNOV TEST)
  2. 【原创+整理】简述何为调用约定,函数导出名以及extern C
  3. 一种C#读写二进制文件的通用方法
  4. 批量添加AD账号(三)
  5. 一天一种设计模式(一)------观察者模式
  6. [GAN学习系列] 初始GAN
  7. Linux作者批评英特尔指令集,英特尔回应 Linus Torvalds 对 AVX512 的批评
  8. 关于cocos2d-js中使用 ClippingNode 以及 BlendFunc 来实现遮罩
  9. 爬虫3 requests基础之 乱码编码问题
  10. LuaForUnity4:Lua的函数
  11. 5. PHP APC APCu 安装使用
  12. Ruby gem 更换国内源
  13. MyBatis使用Mapper动态代理开发Dao层
  14. 别让你的项目,毁在单片机选型上
  15. 重置计算机网络设置路由器,重新设置路由器的步骤
  16. html 选择列表框,列表框的selected属性
  17. MATLAB 8.1 R2013a license.lic 问题
  18. 51Nod 1677 treecnt
  19. SAGI GAMES 创始人曾嵘:瞄准休闲游戏,将“创意”转化为“商业”
  20. 02.1 知识图谱工具 Protege的下载安装与使用

热门文章

  1. Android @id和@+id区别
  2. 3D人脸识别预处理,3D face recognition preprocess
  3. python 数据结构-字典
  4. 牛客网(剑指offer) 第十三题 调整数组顺序使奇数位于偶数前面
  5. Git之深入解析本地仓库的基本操作·仓库的获取更新和提交历史的查看撤销以及标签别名的使用
  6. 【数据结构与算法】之柱状图中最大矩形的求解思路和算法示例
  7. 126. Word Ladder II
  8. 128. Longest Consecutive Sequence
  9. gzip: stdin: unexpected end of file
  10. 树莓派AI视觉云台——7、树莓派系统备份