传送门


推式子(默认\(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 莫比乌斯反演、线性筛的更多相关文章

  1. [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 ...

  2. 【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 ...

  3. 【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, ...

  4. 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| ...

  5. 【bzoj2693】jzptab 莫比乌斯反演+线性筛

    题目描述 输入 一个正整数T表示数据组数 接下来T行 每行两个正整数 表示N.M 输出 T行 每行一个整数 表示第i组数据的结果 样例输入 1 4 5 样例输出 122 题解 莫比乌斯反演+线性筛 由 ...

  6. 【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)$之 ...

  7. 【bzoj4407】于神之怒加强版 莫比乌斯反演+线性筛

    题目描述 给下N,M,K.求 输入 输入有多组数据,输入数据的第一行两个正整数T,K,代表有T组数据,K的意义如上所示,下面第二行到第T+1行,每行为两个正整数N,M,其意义如上式所示. 输出 如题 ...

  8. BZOJ3309 DZY Loves Math(莫比乌斯反演+线性筛)

    一通正常的莫比乌斯反演后,我们只需要求出g(n)=Σf(d)*μ(n/d)的前缀和就好了. 考虑怎么求g(n).当然是打表啊.设n=∏piai,n/d=∏pibi .显然若存在bi>1则这个d没 ...

  9. 【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 ...

随机推荐

  1. 开发Spring过程中几个常见异常(二):Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'a' define

    本异常是小编在运行自己另外一篇博文中的例子时遇到的.(附博文:http://www.cnblogs.com/dudududu/p/8482487.html) 完整异常信息: 警告: Exception ...

  2. celery任务进程关闭

    方法1: ps auxww|grep 方法2: Ctrl+C 方法3: celery multi 管理 celery multi start w1 -A proj -l info celery mul ...

  3. 光盘yum源搭建

    先修改基本的yum原源,使其不生效 cd /etc/yum.repos.d/ mv CentOS-Base.repo CentOS-Base.repo.bak 在修改媒介yum源使其生效 检验是否生效 ...

  4. Vue2 学习笔记1

    什么是Vue.js Vue.js 是目前最火的一个前端框架,React是最流行的一个前端框架(React除了开发网站,还可以开发手机App,Vue语法也是可以用于进行手机App开发的,需要借助于Wee ...

  5. Android WebSocket开发

    一,在模块build.gradle中添加webSocket的依赖包 //WebSocket 依赖包 implementation 'com.neovisionaries:nv-websocket-cl ...

  6. 在Lua中提示UnityEngine.dll的方法

    我的环境 安装最新的 EmmyLua-1.2.1及以上版本 IDEA 2017.1.2 及以上版本 关于EmmlyLua的介绍可查看我之前的文章:Lua代码提示和方法跳转 说明:本文方法摘自 Emmy ...

  7. 关于java中assert(断言)的使用讲解

    说明:写的不是很全面,有任何问题请留言,多交流,谢谢! 1.eclipse.myeclipse开启assert(断言),默认是关闭,如下: 说白了就是设置一下jvm的参数,参数是-ea或者-enabl ...

  8. 【算法】LeetCode算法题-Maximum Subarray

    这是悦乐书的第154次更新,第156篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第13题(顺位题号是53).给定一个整数数组nums,找出一个最大和,此和是由数组中索引 ...

  9. MySQL知识总结(一)安装与配置(Linux CentOS)

    1 安装 环境 CentOS yum install -y mysql-server mysql mysql-deve service启动 1.1 启动 service mysqld start 1. ...

  10. 《Java大学教程》—第10章 图形和事件驱动程序

    10.2 Swing程序包AWT(Abstract Window Toolkit): 抽象窗口工具集.依赖于本地操作系统的组件被称为重量级(Heavy Weight)组件,因为它们都会大量使用系统资源 ...