BZOJ3309 DZY Loves Maths 莫比乌斯反演、线性筛
推式子(默认\(N \leq M\)):
\(\begin{align*} \sum\limits_{i=1}^N \sum\limits_{j=1}^Mf(gcd(i,j)) & = \sum\limits_{d=1}^N f(d) \sum\limits_{i=1}^\frac{N}{d} \sum\limits_{j=1}^\frac{M}{d} \sum\limits_{p | gcd(i,j)} \mu(p) \\ &= \sum\limits_{d=1}^N f(d) \sum\limits_{p = 1}^\frac{N}{d} \mu(p) \frac{N}{dp} \frac{M}{dp} \\ &= \sum\limits_{T=1}^N \frac{N}{T} \frac{M}{T} \sum\limits_{d | T} f(d) \mu(\frac{T}{d}) \end{align*}\)
看这个数据范围毫无疑问要将\(g(T) = \sum\limits_{d | T} f(d) \mu(\frac{T}{d})\)线性筛出来,然后就可以数论分块求解。
因为\(f(x)\)比较难处理,所以直接下手似乎不太好做。
注意到因为每一项有\(\mu(d)\),所以如果\(T = p_1^{e_1}p_2^{e_2}...p_k^{e_k} , d = p_1^{e_1'}p_2^{e_2'}...p_k^{e_k'}\),那么\(e_i - 1 \leq e_i' \leq e_i\)时\(f(d) \mu(\frac{T}{d})\)才会有贡献。所以所有有贡献的\(f(d)\)一定为\(\max e_i\)或者\(\max e_i - 1\),考虑这两种贡献对\(g(T)\)的影响就可以得到\(g(T)\)的值。
假设\(e_i\)中能够取到\(\max e_i\)的值有\(x\)个,那么:
当\(x = k\)时,只有\(d = \frac{T}{\prod\limits_{i=1}^k p_i}\)时贡献为\(\max e_i - 1\),此时\(\mu(\frac{T}{d}) = (-1)^k\)。而与此对应的,取到\(\max e_i\)的所有\(f(d) \mu(\frac{T}{d})\)的和就是\((-1)^{k+1} \max e_i\)。所以总贡献就是\((-1)^{k+1}\)
而当\(x \neq k\)时,不难得到取到\(\max e_i - 1\)和\(\max e_i\)的所有值的贡献都是\(0\)。
所以我们只有所有质因子指数相等的数有贡献。在线性筛的时候记录一下最小质因子的个数和去掉最小质因子之后会变成哪个数,就可以计算出所有会有贡献产生的\(T\)。总复杂度\(O(n+q\sqrt{n})\)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
//This code is written by Itst
using namespace std;
inline int read(){
int a = 0;
char c = getchar();
bool f = 0;
while(!isdigit(c) && c != EOF){
if(c == '-')
f = 1;
c = getchar();
}
if(c == EOF)
exit(0);
while(isdigit(c)){
a = a * 10 + c - 48;
c = getchar();
}
return f ? -a : a;
}
const int MAXN = 1e7 + 7;
int prime[MAXN] , num[MAXN] , pre[MAXN] , cntP[MAXN] , val[MAXN] , cnt;
void init(){
for(int i = 2 ; i <= 1e7 ; ++i){
if(!cntP[i]){
prime[++cnt] = i;
num[i] = cntP[i] = 1;
}
for(int j = 1 ; j <= cnt && i * prime[j] <= 1e7 ; ++j){
if(i % prime[j] == 0){
cntP[i * prime[j]] = cntP[i];
num[i * prime[j]] = num[i] + 1;
pre[i * prime[j]] = pre[i];
break;
}
num[i * prime[j]] = 1;
pre[i * prime[j]] = i;
cntP[i * prime[j]] = cntP[i] + 1;
}
}
for(int i = 2 ; i <= 1e7 ; ++i)
if(!pre[i] || num[pre[i]] == num[i])
val[i] = (cntP[i] & 1 ? 1 : -1);
else num[i] = 0;
for(int i = 2 ; i <= 1e7 ; ++i)
val[i] += val[i - 1];
}
int main(){
#ifndef ONLINE_JUDGE
freopen("in","r",stdin);
//freopen("out","w",stdout);
#endif
init();
for(int T = read() ; T ; --T){
long long N = read() , M = read() , sum = 0;
if(N > M) N ^= M ^= N ^= M;
for(int i = 1 , pi ; i <= N ; i = pi + 1){
pi = min(N / (N / i) , M / (M / i));
sum += (N / i) * (M / i) * (val[pi] - val[i - 1]);
}
cout << sum << '\n';
}
return 0;
}
BZOJ3309 DZY Loves Maths 莫比乌斯反演、线性筛的更多相关文章
- [BZOJ3309]DZY Loves Math(莫比乌斯反演+线性筛)
$\sum\limits_{T=1}^{n}\lfloor\frac{n}{T}\rfloor\lfloor\frac{m}{T}\rfloor\sum\limits_{d|T}f(d)\mu(\fr ...
- 【BZOJ3309】DZY Loves Math 莫比乌斯反演+线性筛(好题)
[BZOJ3309]DZY Loves Math Description 对于正整数n,定义f(n)为n所含质因子的最大幂指数.例如f(1960)=f(2^3 * 5^1 * 7^2)=3, f(10 ...
- 【bzoj3309】DZY Loves Math 莫比乌斯反演+线性筛
Description 对于正整数n,定义f(n)为n所含质因子的最大幂指数.例如f(1960)=f(2^3 * 5^1 * 7^2)=3, f(10007)=1, f(1)=0. 给定正整数a,b, ...
- BZOJ 3309: DZY Loves Math [莫比乌斯反演 线性筛]
题意:\(f(n)\)为n的质因子分解中的最大幂指数,求\(\sum_{i=1}^n \sum_{j=1}^m f(gcd(i,j))\) 套路推♂倒 \[ \sum_{D=1}^n \sum_{d| ...
- 【bzoj2693】jzptab 莫比乌斯反演+线性筛
题目描述 输入 一个正整数T表示数据组数 接下来T行 每行两个正整数 表示N.M 输出 T行 每行一个整数 表示第i组数据的结果 样例输入 1 4 5 样例输出 122 题解 莫比乌斯反演+线性筛 由 ...
- 【bzoj2694】Lcm 莫比乌斯反演+线性筛
题目描述 求$\sum\limits_{i=1}^n\sum\limits_{j=1}^m|\mu(gcd(i,j))|lcm(i,j)$,即$gcd(i,j)$不存在平方因子的$lcm(i,j)$之 ...
- 【bzoj4407】于神之怒加强版 莫比乌斯反演+线性筛
题目描述 给下N,M,K.求 输入 输入有多组数据,输入数据的第一行两个正整数T,K,代表有T组数据,K的意义如上所示,下面第二行到第T+1行,每行为两个正整数N,M,其意义如上式所示. 输出 如题 ...
- BZOJ3309 DZY Loves Math(莫比乌斯反演+线性筛)
一通正常的莫比乌斯反演后,我们只需要求出g(n)=Σf(d)*μ(n/d)的前缀和就好了. 考虑怎么求g(n).当然是打表啊.设n=∏piai,n/d=∏pibi .显然若存在bi>1则这个d没 ...
- 【BZOJ3309】DZY Loves Math - 莫比乌斯反演
题意: 对于正整数n,定义$f(n)$为$n$所含质因子的最大幂指数.例如$f(1960)=f(2^3 * 5^1 * 7^2)=3$,$f(10007)=1$,$f(1)=0$. 给定正整数$a,b ...
随机推荐
- Ubuntu下解压缩文件
记录Ubuntu下各种压缩和解压方式: .tar解包:tar xvf FileName.tar打包:tar cvf FileName.tar DirName(注:tar是打包,不是压缩!)—————— ...
- 2014/08/31 Zushi
今天是逗子森户海滨浴场开放的最后一天,趁着最后的光景来这里透透气. 在学皮划艇准备下海的人们,貌似还挺有趣. 来自云端的上帝之手. 谁愿意和我一起向着夕阳弄桨. 夕阳西下,那里是家乡的方向. 灯塔和神 ...
- C#核心基础--静态类&部分类
静态类 用 static 关键字修饰的类叫做静态类,静态类通常用来定义工具类.静态类不能实例化,不能从指定基类继承而来,静态类隐式从 Object 类继承而来.静态类只能包含静态成员和常量,因为常量是 ...
- JS实现定时器
导出:jquery.timers-1.2.js jQuery Timers提供了三个函式 1. everyTime(时间间隔, [定时器名称], 函式名称, [次数限制], [等待函式程序完成])2. ...
- Windows Server 2016-Nano Server介绍
WindowsServer 2016 提供了新的安装选项:Nano Server.Nano Server 是针对私有云和数据中心进行优化的远程管理的服务器操作系统. 类似于 Windows Serve ...
- 【PAT】B1009 说反话
在输入时直接分别将每个单词放入字符串,逆序输出字符串数组 #include<stdio.h> int main(){ int num=0; char ans[90][90]; while( ...
- Linux中的文件查找技巧
前言 Linux常用命令中,有些命令可以帮助我们查找二进制文件,帮助手册或源文件的位置,也有的命令可以帮助我们查找磁盘上的任意文件,今天我们就来看看这些命令如何使用. witch witch命令会在P ...
- 《生命》第四集:Fish (鱼类)
旗鱼,是游动最快的鱼,他们不仅速度快,背上的鱼鳍还能吓唬成群的沙丁鱼,他们依靠速度与技巧结队捕食. 飞鱼,继续讲述了一下,飞鱼可以飞起来,把捕食者远远甩掉:飞鱼保护后代的方式是把卵产在水中的树叶上,很 ...
- IE和其他浏览器内核
1.qq急速 2.qq的IE兼容模式 3.Edge 4.IE11 5.chrome js获取浏览器内核 <script language="JavaScript" type= ...
- 从n个数里面选择m个数
从n个数里面选择m个数 #include<iostream> #include<vector> using namespace std; vector<int> s ...