Luogu4240 毒瘤之神的考验 莫比乌斯反演、根号分治
首先有\(\varphi(ij) = \frac{\varphi(i) \varphi(j) \gcd(i,j)}{\varphi(\gcd(i,j))}\),把欧拉函数的定义式代入即可证明
然后就可以开始推式子(默认\(n \leq m\)):
\(\begin{align*} \sum\limits_{i=1}^n \sum\limits_{j=1}^m \varphi(ij) &= \sum\limits_{i=1}^n \sum\limits_{j=1}^m \frac{\varphi(i) \varphi(j) \gcd(i,j)}{\varphi(\gcd(i,j))} \\ &= \sum\limits_{d=1}^n \frac{d}{\varphi(d)} \sum\limits_{i=1}^{\frac{n}{d}} \sum\limits_{j=1}^{\frac{m}{d}} \varphi(id) \varphi(jd) \sum\limits_{p | i , p | j} \mu(p) \\ &= \sum\limits_{d=1}^n \frac{d}{\varphi(d)} \sum\limits_{p=1}^\frac{n}{d} \mu(p) \sum\limits_{i=1}^\frac{n}{dp} \varphi(idp) \sum\limits_{j=1}^\frac{m}{dp} \varphi(jdp) \\ &= \sum\limits_{T=1}^n \sum\limits_{d | T}\frac{d}{\varphi(d)} \mu(\frac{T}{d}) \sum\limits_{i=1}^\frac{n}{T} \varphi(iT) \sum\limits_{j=1}^\frac{m}{T} \mu(jT) \end{align*}\)
\(f(T) = \sum\limits_{d | T} \frac{d}{\varphi(d)} \mu(\frac{T}{d})\)可以在\(O(nlogn)\)的时间内预处理,而\(g(p,q) = \sum\limits_{i=1}^p \varphi(iq)\)则因为需要满足\(pq \leq n\)所以只有\(O(nlogn)\)对\((p,q)\)合法,使用动态数组可以做到\(O(nlogn)\)的预处理。
我们现在需要求的就是\(\sum\limits_{T = 1}^n f(T) g(\frac{n}{T} , T) g(\frac{m}{T} , T)\),注意到有两个除法,可以想到数论分块,但是因为是三个东西相乘求和,所以我们需要预处理的是对于\(\forall i \in [1,10^5] , \forall j \in [1 , 10^5] , \forall k \in [1,n] , \sum\limits_{T=1}^k f(T) g(i,T) g(j,T)\),复杂度太高难以接受,而直接暴力只有50pts。
注意到我们现在有预处理和暴力两种做法,虽然它们都会TLE,但是我们可以考虑根号分治,把它们放在一起做。
考虑预处理\(\forall i \in [1,B] , \forall j \in [1,B] , \forall k \in [1,n] , \sum\limits_{T=1}^k f(T) g(i,T) g(j,T)\),其中\(B\)是一个常数。那么我们预处理的复杂度就是\(O(nB^2)\),而在数论分块的过程中,如果\(\frac{n}{T} , \frac{m}{T}\leq B\)则直接调用答案,否则暴力计算,因为\(\frac{n}{T} \geq B\)意味着\(T \leq \frac{n}{B}\),所以复杂度是\(O(T\frac{n}{B})\)的。
那么总的复杂度就是\(O(nB^2 + \frac{Tn}{B})\),当\(B = T^\frac{1}{3}\)时有最优复杂度\(O(nT^\frac{2}{3})\)。
#include<bits/stdc++.h>
//this code is written by Itst
using namespace std;
const int _ = 1e5 + 7 , MOD = 998244353 , B = pow(10000 , 1.0 / 3) + 1;
int phi[_] , mu[_] , prm[_] , cnt , T , N , M;
int *g[_] , f[_] , ans[B + 3][B + 3][_];
bool nprm[_];
int poww(long long a , int b){
int times = 1;
while(b){
if(b & 1) times = times * a % MOD;
a = a * a % MOD;
b >>= 1;
}
return times;
}
void init(){
mu[1] = phi[1] = 1;
for(int i = 2 ; i <= 1e5 ; ++i){
if(!nprm[i]){
prm[++cnt] = i; phi[i] = i - 1; mu[i] = -1;
}
for(int j = 1 ; i * prm[j] <= 1e5 ; ++j){
nprm[i * prm[j]] = 1;
if(i % prm[j] == 0){
phi[i * prm[j]] = phi[i] * prm[j];
break;
}
phi[i * prm[j]] = phi[i] * (prm[j] - 1);
mu[i * prm[j]] = -1 * mu[i];
}
}
for(int i = 1 ; i <= 1e5 ; ++i){
int tms = 1ll * i * poww(phi[i] , MOD - 2) % MOD;
for(int j = 1 ; j * i <= 1e5 ; ++j)
f[i * j] = (f[i * j] + 1ll * mu[j] * tms + MOD) % MOD;
}
for(int i = 1 ; i <= 1e5 ; ++i){
g[i] = new int[(int)(1e5 / i) + 1];
g[i][0] = 0;
for(int j = 1 ; j * i <= 1e5 ; ++j)
g[i][j] = (g[i][j - 1] + phi[i * j]) % MOD;
}
for(int i = 1 ; i <= B ; ++i)
for(int j = i ; j <= B ; ++j)
for(int k = 1 ; j * k <= 1e5 ; ++k)
ans[i][j][k] = (ans[i][j][k - 1] + 1ll * f[k] * g[k][i] % MOD * g[k][j]) % MOD;
}
void work(){
cin >> N >> M;
if(N > M) swap(N , M);
int sum = 0;
for(int i = 1 , pi; i <= N ; i = pi + 1){
pi = min(N / (N / i) , M / (M / i));
if(N / i <= B && M / i <= B)
sum = (0ll + sum + ans[N / i][M / i][pi] - ans[N / i][M / i][i - 1] + MOD) % MOD;
else
for(int j = i ; j <= pi ; ++j)
sum = (sum + 1ll * f[j] * g[j][N / j] % MOD * g[j][M / j]) % MOD;
}
cout << sum << endl;
}
signed main(){
#ifndef ONLINE_JUDGE
freopen("in","r",stdin);
freopen("out","w",stdout);
#endif
ios::sync_with_stdio(0);
init();
cin >> T;
while(T--) work();
return 0;
}
Luogu4240 毒瘤之神的考验 莫比乌斯反演、根号分治的更多相关文章
- luogu 4240 毒瘤之神的考验 (莫比乌斯反演)
题目大意:略 题面传送门 果然是一道神duliu题= = 出题人的题解传送门 出题人的题解还是讲得很明白的 1.关于$\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m ...
- luogu4240 毒瘤之神的考验(毒瘤乌斯反演)
link 题意:求出\(\sum_{i=1}^n\sum_{j=1}^m\varphi(ij)\),对998244353取模 多组数据,\(T\le 10^4,n,m\le 10^5\). 前置知识: ...
- Codeforces.871D.Paths(莫比乌斯反演 根号分治)
题目链接 \(Description\) 给定\(n\),表示有一张\(n\)个点的无向图,两个点\(x,y\)之间有权值为\(1\)的边当且仅当\(\gcd(x,y)\neq1\).求\(1\sim ...
- 洛谷 P4240 毒瘤之神的考验 解题报告
P4240 毒瘤之神的考验 题目背景 \(\tt{Salamander}\)的家门口是一条长长的公路. 又是一年春天将至,\(\tt{Salamander}\)发现路边长出了一排毒瘤! \(\tt{S ...
- P4240 毒瘤之神的考验
题目 P4240 毒瘤之神的考验 神仙题\(emmm\) 前置 首先有一个很神奇的性质: \(\varphi(ij)=\dfrac{\varphi(i)\varphi(j)gcd(i,j)}{\var ...
- 洛谷 P4240 - 毒瘤之神的考验(数论+复杂度平衡)
洛谷题面传送门 先扯些别的. 2021 年 7 月的某一天,我和 ycx 对话: tzc:你做过哪些名字里带"毒瘤"的题目,我做过一道名副其实的毒瘤题就叫毒瘤,是个虚树+dp yc ...
- [luogu 4240] 毒瘤之神的考验
题目背景 Salamander的家门口是一条长长的公路. 又是一年春天将至,Salamander发现路边长出了一排毒瘤! Salamander想带一些毒瘤回家,但是,这时毒瘤当中钻出来了一个毒瘤之神! ...
- Luogu 4240:毒瘤之神的考验
传送门 Sol 分开考虑 \(\varphi(ij)\) 中 \(ij\) 的质因子 那么 \[\varphi(ij)=\frac{\varphi(i)\varphi(j)gcd(i,j)}{\var ...
- 从 [P4240 毒瘤之神的考验] 谈 OI 中的美学
感觉这题真的特别有意思,涉及了 OI 中很多非常有意思.非常美的手法,比如--平衡两部分的时间复杂度.\(n \ln n\) 的那个 Trick等等,真的一种暴力的美学. 题目大意: 多组询问,求 \ ...
随机推荐
- MuPAD使用总结
MuPAD使用总结 一.打开notebook界面的方法: 二.notebook界面的三种区域 (一).输入区域 输入区域在打开来的时候就有,就是,但是之后如果还想再加,可以点击上方红色框内的图标. 这 ...
- 洛谷 P4822 [BJWC2012]冻结 题解
P4822 [BJWC2012]冻结 题目描述 "我要成为魔法少女!" "那么,以灵魂为代价,你希望得到什么?" "我要将有关魔法和奇迹的一切,封印于 ...
- hive 整合ranger
一.安装hive插件 1.解压安装 # tar zxvf ranger-2.0.0-SNAPSHOT-hive-plugin.tar.gz -C /data1/hadoop/ 2.修改install ...
- fluent将出口温度赋值给入口
Fluent版本:Fluent18.2 首先我们启动Fluent 然后按照正常的流程进行模型缩放,材料的设置,边界条件的设置等等,然后初始化. 在完成了算例的初始化以后 (define (OutToI ...
- python练习:寒冰猴子狐狸,猫狗咬架
python练习:寒冰猴子狐狸,猫狗咬架 一,寒冰猴子狐狸 class Person: def __init__(self, na, gen, age, fig): self.name = na se ...
- k8s 传参给docker env command、args和dockerfile中的entrypoint、cmd之间的关系
[k8s]args指令案例-彻底理解docker entrypoint 需求: 搞个镜像,可以运行java -jar xxx.jar包,xxx.jar包名称要用参数传 思路1: 打对应运行ja ...
- Xamarin图表开发基础教程(9)OxyPlot框架
Xamarin图表开发基础教程(9)OxyPlot框架 OxyPlot组件构成 OxyPlot组件主要由两个类构成,分别为PlotView和PlotModel.这两个类我们在上文中也使用到了.本节将讲 ...
- openstack虚拟机获取不到ip
一.现象描述: openstack平台中创建虚拟机后,虚拟机在web页面中显示获取到了ip,但是打开虚拟机控制台后查看网络状态,虚拟机没有ip地址,下图为故障截图: 二.分析思路: (1)查看neut ...
- oracle的merge语法
merge into trade.ttradeseat ausing trade.bs_zrt_tradeseat bon (a.L_FUND_ID = b.l_Fund_Id and a.l_bas ...
- 系统运维工程师装逼完全指南(转载Mark)
1.全球化的认证有助于提升逼格,什么OCM.CCIE.RHCA.CISSP等等能考都考,再不济,也要有一张系统架构设计师或者网络规划设计师的信产部认证.每过一个认证,逼格提升一档. 2.TCP/IP协 ...