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 ...
随机推荐
- VRRP技术总结和配置实践
1.VRRP作为网关可靠性的常用方法,基本思路是,两台路由器组成一个虚拟路由器,通过VRRP协议对内网呈现一个虚拟的网关ip, 以便让局域网内部的终端通过这个虚拟网关对外进行通信. 2.VRRP的最简 ...
- java内存分配与垃圾回收
JVM的内存分配主要基于两种,堆和栈. 我们来看一下java程序运行时候的内存分配策略: 1):静态存储区(方法区): 2):栈区: 3):堆区: 1):主要存放静态数据,全局static数据和常量. ...
- PMS 修改禅道默认首页元素及展示
修改禅道默认首页元素及展示 by:授客 QQ:1033553122 测试环境: 禅道项目管理软件ZenTaoPMS.9.5.1.win64 需求描述 如下,安装禅道后访问默认首页,展示如下,我们希望它 ...
- (网页)JavaScript周末总结(一)
本周学习的内容总结: 1. 2章在html中使用javascript. 2. 3章Javascript的基本概念. 3. 4章变量,作用域,内存问题. 1-1:2章以下内容: 1.包含javascri ...
- robot framework笔记(一):环境配置(基于python3)+在pycharm中编写及运行robot脚本
(一)使用pip安装robotframework框架和seleniumlibrary库 pip install --upgrade robotframework pip install --upgra ...
- windows下安装mysql
windows 下安装mysql 1.先下载好 mysql5.7 版本的安装包,可以去官网自己下载,也可以从我的百度云分享 里面下载: 链接: https://pan.baidu.com/s/1VXk ...
- VS调式时出现异常,在输入法是中文状态下,输入框输入字母再回车,会造成页面关闭,vs退出调式
解决方案:关闭浏览器窗口关闭时,停止调试 .就恢复正常,无异常
- Linux内存描述之概述--Linux内存管理(一)
1 前景回顾 1.1 UMA和NUMA两种模型 共享存储型多处理机有两种模型 均匀存储器存取(Uniform-Memory-Access,简称UMA)模型 将可用内存以连续方式组织起来, 非均匀存储器 ...
- shell 函数用法
近期在学习shell编程方面的知识,写的不怎么好,请大家多多指点,下面给大家分享一下shell函数的用法. 我们为什么要用shell函数? 简单的说,函数的作用就是把程序多次调用相同的代码部分定义成一 ...
- [Hive_10] Hive 的分析函数
0. 说明 Hive 的分析函数 窗口函数 | 排名函数 | 最大值 | 分层次 | lead && lag 统计活跃用户 | cume_dist 1. 窗口函数(开窗函数) ove ...