JZPTAB

求\(\sum_{i=1}^n\sum_{j=1}^mlcm(i,j)\)

\(=\sum_{i=1}^n\sum_{j=1}^m\frac{ij}{\gcd(i,j)}\)

枚举gcd,这里默认n<m

\(=\sum_{p=1}^n\frac 1 p\sum_{i=1}^n\sum_{j=1}^mij[\gcd(i,j)=p]\)

\(=\sum_{p=1}^n\frac 1 p\sum_{i=1}^{n/p}\sum_{j=1}^{m/p}ijp^2[\gcd(i,j)=1]\)

\(=\sum_{p=1}^np\sum_{i=1}^{n/p}\sum_{j=1}^{m/p}ij[\gcd(i,j)=1]\)

推到这我一般喜欢接着推下去,不过观察了下你谷的题解发现可以适当地设一些函数,方便后面的思考、写代码等等

例如这里我们设\(g(x,y)=\sum_{i=1}^x\sum_{j=1}^yij[gcd(i,j)=1]\),那么ans\(=\sum_{p=1}^np\cdot g(\frac np,\frac mp)\),假设我们能快速地求出g值,那么我们就可以打个两个数的数论分块,在根号求出ans

然后我们考虑\(g(x,y)=\sum_{i=1}^x\sum_{j=1}^yij[gcd(i,j)=1]\)

\(g(x,y)=\sum_{i=1}^x\sum_{j=1}^yij\sum_{d|i,d|j}\mu(d)\)

\(g(x,y)=\sum_{d=1}^n\mu(d)d^2\sum_{i=1}^{x/d}\sum_{j=1}^{y/d}ij\)

\(g(x,y)=\sum_{d=1}^n\mu(d)d^2(\sum_{i=1}^{x/d}i)(\sum_{j=1}^{y/d}j)\)

显然\(\sum_{i=1}^ni=\frac{n(n+1)}2\),为了简便,我们设\(f(x)=\frac{x(x+1)}2\)

则\(g(x,y)=\sum_{d=1}^n\mu(d)d^2f(\lfloor\frac x d\rfloor)f(\lfloor\frac y d\rfloor)\)

这个显然也可以用数论分块那套理论,复杂度为根号

两个根号套一起就是\(O(n)\)了。这题\(n\)是\(10^7\),要稍微卡卡常数。。。

不用卡常数,交上去第一遍WA了,define int longlong就A了。。。

没开O2,一共9248ms,跑的飞慢

#include <cstdio>
#include <functional>
using namespace std; #define int long long bool vis[10000010];
int prime[1000000], tot;
long long mu[10000010]; const int fuck = 10000000, p = 20101009; int n, m; int f(int x) { return x * (long long)(x + 1) / 2 % p; } int g(int x, int y)
{
int res = 0;
if (x > y) swap(x, y);
for (int i = 1, j; i <= x; i = j + 1)
{
j = min(x / (x / i), y / (y / i));
res = (res + (mu[j] - mu[i - 1]) * (long long)f(x / i) % p * (long long)f(y / i) % p) % p;
if (res < 0) res += p;
}
return res;
} signed main()
{
mu[1] = 1;
for (int i = 2; i <= fuck; i++)
{
if (vis[i] == false) prime[++tot] = i, mu[i] = -1;
for (int j = 1; j <= tot && i * prime[j] <= fuck; j++)
{
vis[i * prime[j]] = true;
if (i % prime[j] == 0)
break;
mu[i * prime[j]] = -mu[i];
}
mu[i] *= i * i;
mu[i] += mu[i - 1];
mu[i] %= p;
}
int n, m;
scanf("%lld%lld", &n, &m);
if (n > m) swap(n, m);
int ans = 0;
for (int i = 1, j; i <= n; i = j + 1)
{
j = min(n / (n / i), m / (m / i));
ans = (ans + (j - i + 1) * (long long)(i + j) / 2 % p * (long long)g(n / i, m / i) % p) % p;
}
printf("%lld\n", ans);
return 0;
}

Luogu1829 JZPTAB的更多相关文章

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

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

  2. BZOJ 2693: jzptab [莫比乌斯反演 线性筛]

    2693: jzptab Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1194  Solved: 455[Submit][Status][Discu ...

  3. 【BZOJ】【2693】JZPTAB

    莫比乌斯反演 PoPoQQQ讲义第5题,是BZOJ 2154的升级版(多次询问) 题解:http://blog.csdn.net/popoqqq/article/details/42078725 WA ...

  4. 【莫比乌斯反演】关于Mobius反演与lcm的一些关系与问题简化(BZOJ 2154 crash的数字表格&&BZOJ 2693 jzptab)

    BZOJ 2154 crash的数字表格 Description 今天的数学课上,Crash小朋友学习了最小公倍数(Least Common Multiple).对于两个正整数a和b,LCM(a, b ...

  5. bzoj 2693: jzptab 线性筛积性函数

    2693: jzptab Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 444  Solved: 174[Submit][Status][Discus ...

  6. 【BZOJ 2693】jzptab(莫比乌斯+分块)

    2693: jzptab Description Input 一个正整数T表示数据组数 接下来T行 每行两个正整数 表示N.M Output T行 每行一个整数 表示第i组数据的结果 Sample I ...

  7. BZOJ 2693: jzptab( 莫比乌斯反演 )

    速度居然#2...目测是因为我没用long long.. 求∑ lcm(i, j) (1 <= i <= n, 1 <= j <= m) 化简之后就只须求f(x) = x∑u( ...

  8. 【BZOJ2693】jzptab(莫比乌斯反演)

    [BZOJ2693]jzptab(莫比乌斯反演) 题面 讨厌权限题,只能跑到别的OJ上交 和这题是一样的 多组数据 求\[\sum_{i=1}^n\sum_{j=1}^mlcm(i,j)\] 题解 前 ...

  9. 【BZOJ2693】jzptab [莫比乌斯反演]

    jzptab Time Limit: 10 Sec  Memory Limit: 512 MB[Submit][Status][Discuss] Description   求 Input 第一行一个 ...

随机推荐

  1. Spring学习十 rest

    1:  Web  service:  是一个大的概念范畴,它表现了一种设计思想 SOAP 是 Web service 的一个重要组成部份. SOAP 是一种协议而非详细产品.SOAP 是通过 XML ...

  2. python startswith与endswith

    如果你要用python匹配字符串的开头或末尾是否包含一个字符串,就可以用startswith,和endswith比如:content = 'ilovepython'如果字符串content以ilove ...

  3. 【转】Rails中Bootstrap的安装和使用

     转自:http://blog.csdn.net/lissdy/article/details/9195651   眼看着前端攻城师们都开始使用Bootstrap创作网页,于是也想学着在最近正在学习的 ...

  4. 前端js上传文件后端C#接收文件

    本文粗略的讲下前端文件上传和后端文件接收的原理 前端代码 html <form onsubmit="uploadFile(event)"> <input type ...

  5. DAY11-MYSQL之ORM框架SQLAlchemy

    一 介绍 SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作,简言之便是:将对象转换成SQL,然后使用数据API执行SQL并获取 ...

  6. 什么是Scatter/Gather?

    scatter/gather指的在多个缓冲区上实现一个简单的I/O操作,比如从通道中读取数据到多个缓冲区,或从多个缓冲区中写入数据到通道: scatter(分散):指的是从通道中读取数据分散到多个缓冲 ...

  7. 指静脉屏幕说明usart hmi

    1. 1.usart HMI 下载最新版软件 2.如上图可以设置横屏 3.txt的最大字符默认是10 要改大一些 4.t0.txt="aaa" 这是串口通讯命令但前面还有开始码

  8. Python 网络爬虫 007 (编程) 通过网站地图爬取目标站点的所有网页

    通过网站地图爬取目标站点的所有网页 使用的系统:Windows 10 64位 Python 语言版本:Python 2.7.10 V 使用的编程 Python 的集成开发环境:PyCharm 2016 ...

  9. php学习笔记-do while循环

    do{ func(); }while(condition) do while执行逻辑是先执行循环体里面的代码,再判断condition是否为true,如果是则和while循环一样了.如果conditi ...

  10. 算法Sedgewick第四版-第1章基础-014一用stack把前置表达式转为后置表达式并计算值

    1. /************************************************************************* * Exercise 1.3.10 * * ...