正题

题目链接:https://www.luogu.com.cn/problem/P4240


题目大意

\(Q\)组数据给出\(n,m\)求

\[\sum_{i=1}^n\sum_{j=1}^m\varphi(i\times j)
\]

\(1\leq Q\leq 10^4,1\leq n,m\leq 10^5\)


解题思路

首先需要知道的结论就是

\[\varphi(i\times j)=\varphi(i)\varphi(j)\frac{gcd(i,j)}{\varphi(gcd(i,j))}
\]

然后推一下式子

\[\sum_{i=1}^n\sum_{j=1}^m\varphi(i)\varphi(j)\frac{gcd(i,j)}{\varphi(gcd(i,j))}
\]
\[\sum_{d=1}^n\frac{d}{\varphi(d)}\sum_{d|i}^n\sum_{d|j}^m\varphi(i)\varphi(j)[gcd(i,j)=d]
\]

然后莫反一波

\[\sum_{d=1}^n\frac{d}{\varphi(d)}\sum_{z|d}^n\mu(\frac{z}{d})\sum_{z|i}^n\sum_{z|j}^m\varphi(i)\varphi(j)
\]

提出\(z\)来

\[\sum_{z=1}^n(\sum_{z|i}^n\varphi(i)\sum_{z|j}^m\varphi(j))\sum_{d|z}\mu(\frac{z}{d})\frac{d}{\varphi(d)}
\]

后面那个很好求,线性筛然后\(O(n\log n)\)处理就好了,并且设为\(g_i\),后面需要用到。但是前面那个比较麻烦,而且我们好像就推不动了。

这其实是一个挺经典的\(track\)的,考虑平衡规划。设定一个\(T\),对于小于等于\(T\)的部分我们暴力算,对于大于\(T\)的部分我们考虑预处理。

设\(f_{i,j}=\sum_{j|x}^i\varphi(x)\),然后再设一个\(h_{i,j,k}\)

\[h_{i,j,k}=\sum_{x=T+1}f_{i,j}\times f_{i,k}\times g_{i}
\]

这个可以用一个前缀和\(O(n\frac{n}{T}^2)\)的做到。

然后大于\(T\)的部分我们就可以用上面预处理的\(h\)+整除分块做到\(O(\sqrt n)\)了。

总共的时间复杂度是\(O(n\sqrt n+nT^2+Q(T+\sqrt n))\)

将\(T\)设为\(n^{\frac{2}{3}}\)就是\(O(n\sqrt n+n^{\frac{4}{3}}+Qn^{\frac{2}{3}})\)了。


code

// QuantAsk is stoorz's son
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<cmath>
#define ll long long
using namespace std;
const ll N=1e5+10,P=998244353;
ll Q,n,m,cnt,pri[N],inv[N],mu[N],phi[N],g[N],o[N];
bool v[N];vector<ll> f[N],h[N];
void prime(){
phi[1]=mu[1]=1;
for(ll i=2;i<N;i++){
if(!v[i])pri[++cnt]=i,phi[i]=i-1,mu[i]=-1;
for(ll j=1;j<=cnt&&i*pri[j]<N;j++){
v[i*pri[j]]=1;
if(i%pri[j]==0){
phi[i*pri[j]]=phi[i]*pri[j];
break;
}
phi[i*pri[j]]=phi[i]*(pri[j]-1);
mu[i*pri[j]]=-mu[i];
}
}
inv[1]=1;
for(ll i=2;i<N;i++)
inv[i]=P-(P/i)*inv[P%i]%P;
for(ll i=1;i<N;i++)
for(ll j=i;j<N;j+=i)
(g[j]+=inv[phi[i]]*i%P*mu[j/i])%=P;
return;
}
signed main()
{
prime();
ll L=1e5,T=(ll)pow(L,2.0/3.0)+1;
f[0].resize(L+1);
for(ll i=1;i<=L;i++){
f[i].resize(L/i+1);
for(ll j=1;j<=L/i;j++)
f[i][j]=(f[i][j-1]+phi[i*j])%P;
}
h[T].resize((L/T)*(L/T)+1);
for(ll i=T+1;i<=L;i++){
ll p=L/i;h[i].resize(p*p+1);
for(ll j=1;j<=p;j++)
for(ll k=1;k<=p;k++)
h[i][(j-1)*p+k]=(h[i-1][(j-1)*o[i-1]+k]+f[i][j]*f[i][k]%P*g[i]%P)%P;
o[i]=p;
}
scanf("%lld",&Q);
while(Q--){
scanf("%lld%lld",&n,&m);
if(n>m)swap(n,m);ll ans=0;
for(ll i=1;i<=min(T,n);i++)
(ans+=f[i][n/i]*f[i][m/i]%P*g[i]%P)%=P;
for(ll l=T+1,r;l<=n;l=r+1){
r=min(n/(n/l),m/(m/l));
(ans+=h[r][(n/l-1)*o[r]+m/l]-h[l-1][(n/l-1)*o[l-1]+m/l])%=P;
}
printf("%lld\n",(ans+P)%P);
}
return 0;
}

P4240-毒瘤之神的考验【莫比乌斯反演,平衡规划】的更多相关文章

  1. luogu 4240 毒瘤之神的考验 (莫比乌斯反演)

    题目大意:略 题面传送门 果然是一道神duliu题= = 出题人的题解传送门 出题人的题解还是讲得很明白的 1.关于$\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m ...

  2. Luogu4240 毒瘤之神的考验 莫比乌斯反演、根号分治

    传送门 首先有\(\varphi(ij) = \frac{\varphi(i) \varphi(j) \gcd(i,j)}{\varphi(\gcd(i,j))}\),把欧拉函数的定义式代入即可证明 ...

  3. 洛谷 P4240 毒瘤之神的考验 解题报告

    P4240 毒瘤之神的考验 题目背景 \(\tt{Salamander}\)的家门口是一条长长的公路. 又是一年春天将至,\(\tt{Salamander}\)发现路边长出了一排毒瘤! \(\tt{S ...

  4. P4240 毒瘤之神的考验

    题目 P4240 毒瘤之神的考验 神仙题\(emmm\) 前置 首先有一个很神奇的性质: \(\varphi(ij)=\dfrac{\varphi(i)\varphi(j)gcd(i,j)}{\var ...

  5. 洛谷 P4240 - 毒瘤之神的考验(数论+复杂度平衡)

    洛谷题面传送门 先扯些别的. 2021 年 7 月的某一天,我和 ycx 对话: tzc:你做过哪些名字里带"毒瘤"的题目,我做过一道名副其实的毒瘤题就叫毒瘤,是个虚树+dp yc ...

  6. 从 [P4240 毒瘤之神的考验] 谈 OI 中的美学

    感觉这题真的特别有意思,涉及了 OI 中很多非常有意思.非常美的手法,比如--平衡两部分的时间复杂度.\(n \ln n\) 的那个 Trick等等,真的一种暴力的美学. 题目大意: 多组询问,求 \ ...

  7. 洛谷P4240 毒瘤之神的考验 【莫比乌斯反演 + 分块打表】

    题目链接 洛谷P4240 题解 式子不难推,分块打表真的没想到 首先考虑如何拆开\(\varphi(ij)\) 考虑公式 \[\varphi(ij) = ij\prod\limits_{p | ij} ...

  8. YbtOJ#943-平方约数【莫比乌斯反演,平衡规划】

    正题 题目链接:http://www.ybtoj.com.cn/contest/122/problem/3 题目大意 \(S(i)\)表示\(i\)的约数个数,\(Q\)次询问给出\(n,m\)求 \ ...

  9. [luogu 4240] 毒瘤之神的考验

    题目背景 Salamander的家门口是一条长长的公路. 又是一年春天将至,Salamander发现路边长出了一排毒瘤! Salamander想带一些毒瘤回家,但是,这时毒瘤当中钻出来了一个毒瘤之神! ...

随机推荐

  1. vs2019 快捷键汇总

    https://docs.microsoft.com/zh-cn/visualstudio/ide/default-keyboard-shortcuts-for-frequently-used-com ...

  2. vs2019 实现C#调用c++的dll两种方法

    1.托管与非托管的区别 2.非托管类的实现 第一步:创建C++空项目(命名Caculate)添加一个类AddOperate 第二步:将C++代码编译成动态库dll 第三步:将dll拷贝到c#项目输入目 ...

  3. C#设计模式---模板方法模式(Template Method Pattern)

    一.目的 模板方法模式把不变行为搬到超类中,从而去除了子类中的重复代码. 二.定义 模板方法模式:在一个抽象类中定义一个操作的算法骨架,将算法骨架中某些特定的操作延迟到子类中实现. 模板方法使得子类在 ...

  4. JDBC中级篇(MYSQL)——在JDBC中如何获得表中的,自增长的字段值

    注意:其中的JdbcUtil是我自定义的连接工具类:代码例子链接: package c_increment; import java.sql.Connection; import java.sql.P ...

  5. Web应用安全防护-WAF

    web应用开发中不可避免需要考虑web应用的安全问题,那么常见的安全风险包含哪些呢? Web应用常见的安全风险 在web应用开发中可能存在以下的安全风险: 安全风险Top 10 A1:2017-注入 ...

  6. Linkerd 2.10(Step by Step)—配置代理并发

    Linkerd 2.10 系列 快速上手 Linkerd v2 Service Mesh(服务网格) 腾讯云 K8S 集群实战 Service Mesh-Linkerd2 & Traefik2 ...

  7. vue3.0入门(五):vite构建vue项目

    使用vite构建项目步骤 安装node,cmd输入:node -v验证是否安装成功:一般node安装后会自动安装npm,cmd输入:npm -v验证是否安装成功 选择一个文件夹作为项目文件夹,搜索框输 ...

  8. 小程序生成商品分享二维码海报解决方案和实现方式JAVA

    使用技术:  Graphics , 七牛云 , 微信sdk(github上非常出名的wxjava,地址https://github.com/Wechat-Group/WxJava/)直接上干货代码,每 ...

  9. MySQL-表迁移工具的选型-xtrabackup的使用

    1.1. 场景 有的时候test人员可能需要在测试库上比较新的数据,这时候只能是从生产库上面去那了.如果是小表还好实用mysqldump/mysqlpump就可以轻松的解决.但是,如果遇到了大表这将是 ...

  10. docker开启remote-api 2375端口后,Failed to start Docker Application Container Engine,重启docker失败的问题解决

    1.  按照网上的教程修改了 /usr/lib/systemd/system/docerk.service配置后,重启失败.修改/etc/docker/daemon.json 增加hosts后重启也是 ...