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 ...
随机推荐
- iOS------教你如何APP怎么加急审核
苹果的加急审核如何使用呢? 在iTunesconnect页面,点击右上角的“?”图标,在弹出菜单中选择“联系我们”, 联系我们 然后在Contact Us页面,选择“App Review” —> ...
- 转载:python生成以及打开json、csv和txt文件
原文地址:https://blog.csdn.net/weixin_42555131/article/details/82012642 生成txt文件: mesg = "hello worl ...
- Spark Standalone 提交模式
一.Client提交模式 提交命令: ./spark-submit --master spark://node1:7077 --class org.apache.spark.examples.Spar ...
- zabbix监控自动发现监控tomcat(V1)
背景说明: 由于zabbix监控使用自带的模版,只能监控主机上只有1个tomcat的场景适合,虽然网上很多朋友都是在每个监控项上面添加一个空格来解决问题.但是个人感觉这种方法还是蛮麻烦的,所以写一篇使 ...
- HTML—标签与表格 、框架
1.标签 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3 ...
- SQL SERVER启动步骤
第一步 从注册表读取SQL SERVER启动信息 (1)Audit Level:设置SQL SERVER是否记录用户登陆信息 Login Mode:设置SQL SERVER登陆类型是只接受windo ...
- python3基础知识梳理
一.数据类型 1.数字 int(整型) long(长整型) float(浮点型) complex(复数) 2.布尔值 True或False 3.字符串 二.变量 变量命名规则: 变量名只能是 字母 ...
- Hello Flask
Hello Flask Flask简介 Flask是一个使用Python编写的轻量级Web应用框架.基于Werkzeug WSGI工具箱和Jinja2 模板引擎.Flask使用BSD授权.Flask被 ...
- Unity琐碎(3) UGUI 图文混排解决方案和优化
感觉使用Unity之后总能看到各种各样解决混排的方案,只能说明Unity不够体恤下情啊.这篇文章主要讲一下个人在使用过程中方案选择和优化过程,已做记录.顺便提下,开源很多意味着坑,还是要开实际需求. ...
- UDP Health Checks
This chapter describes how to configure different types of health checks for UDP servers in a load-b ...