题目描述

传送门

求 \(\sum\limits_{i=1}^n\sum\limits_{j=1}^m \varphi(ij)(mod\ 998244353)\)

\(T\) 组询问

\(1 \leq n,m,T \leq 10^5\)

分析

令 \(n<m\)

首先,我们把 \(\varphi(ij)\) 拆成 \(\varphi(i)\varphi(j)\frac{gcd(i,j)}{\varphi(gcd(i,j))}\)

考虑求单个欧拉函数的方法

\(\varphi(i)=i\prod\limits_{d \in prime,d|i}\frac{d-1}{d}\)

\(\varphi(i)\varphi(j)\) 比 \(\varphi(ij)\) 多乘了 \(i,j\) 共有的质因子

所以我们要把这些共有的质因子做出的贡献消除

即乘上一个 \(\frac{gcd(i,j)}{\varphi(gcd(i,j))}\)

那么式子就变成了

\(\sum\limits_{i=1}^n\sum\limits_{j=1}^m\varphi(i)\varphi(j)\frac{gcd(i,j)}{\varphi(gcd(i,j))}\)

按照莫比乌斯反演的套路,枚举 \(gcd(i,j)\)

\(\sum\limits_{d=1}^n\frac{d}{\varphi(d)}\sum\limits_{i=1}^{n/d}\sum\limits_{j=1}^{m/d}\varphi(id)\varphi(jd)[gcd(i,j)=1]\)

\(\sum\limits_{d=1}^n\frac{d}{\varphi(d)}\sum\limits_{i=1}^{n/d}\sum\limits_{j=1}^{m/d}\varphi(id)\varphi(jd)\sum\limits_{k|gcd(i,j)}\mu(k)\)

\(\sum\limits_{d=1}^n\frac{d}{\varphi(d)}\sum\limits_{k=1}^{n/d}\mu(k)\sum\limits_{i=1}^{n/dk}\sum\limits_{j=1}^{m/dk}\varphi(idk)\varphi(jdk)\)

\(\sum\limits_{T=1}^n\sum\limits_{d|T}\frac{d}{\varphi(d) }\mu(\frac{T}{d})\sum\limits_{i=1}^{n/T}\sum\limits_{j=1}^{m/T}\varphi(iT)\varphi(jT)\)

设 \(g(T)=\sum\limits_{d|T}\frac{d}{\varphi(d) }\mu(\frac{T}{d}),s(n,m)=\sum\limits_{i=1}^n\varphi(mi)\)

原式变成

\(\sum\limits_{T=1}^ng(T)s(n/T,T)s(n/T,T)\)

\(g\) 数组和 \(s\) 数组可以 \(nlogn\) 预处理出来

然后就可以 \(O(n)\) 计算每一次的答案

总复杂度就是 \(O(nT)\),还是不够优秀

我们可以人为地设一个值 \(top\)

当 \(T<\frac{m}{top}\) 时暴力计算

否则 \(\frac{n}{T},\frac{m}{T}\) 一定是小于 \(top\) 的

那么我们就可以开一个数组把小于 \(top\) 的这一部分预处理出来

然后就可以直接调用

这道题的内存限制是 \(64M\)

所以不能直接开数组

而要开一个内存池或者用 \(vector\)

代码

#include<cstdio>
#include<cmath>
#include<vector>
#define rg register
const int maxn=1e5+5,maxm=55,mod=998244353,tp=52;
inline int addmod(rg int now1,rg int now2){
return now1+=now2,now1>=mod?now1-mod:now1;
}
inline int delmod(rg int now1,rg int now2){
return now1-=now2,now1<0?now1+mod:now1;
}
inline int mulmod(rg long long now1,rg int now2){
return now1*=now2,now1>=mod?now1%mod:now1;
}
int pri[maxn],mmax,phi[maxn],mu[maxn],g[maxn],*f[maxm][maxm],buf[maxn*160],*o=buf,*s[maxn];
int ksm(rg int ds,rg int zs){
rg int nans=1;
while(zs){
if(zs&1) nans=mulmod(nans,ds);
ds=mulmod(ds,ds);
zs>>=1;
}
return nans;
}
bool not_pri[maxn];
void pre(){
not_pri[0]=not_pri[1]=1;
phi[1]=mu[1]=1;
for(rg int i=2;i<=mmax;i++){
if(!not_pri[i]){
pri[++pri[0]]=i;
phi[i]=i-1;
mu[i]=mod-1;
}
for(rg int j=1;j<=pri[0] && 1LL*i*pri[j]<=mmax;j++){
not_pri[i*pri[j]]=1;
if(i%pri[j]==0){
phi[i*pri[j]]=mulmod(pri[j],phi[i]);
break;
} else {
phi[i*pri[j]]=mulmod(phi[pri[j]],phi[i]);
mu[i*pri[j]]=mulmod(mu[pri[j]],mu[i]);
}
}
}
rg int cs;
for(rg int i=1;i<=mmax;i++){
cs=mulmod(i,ksm(phi[i],mod-2));
for(rg int j=i,now=1;j<=mmax;j+=i,now++){
g[j]=addmod(g[j],mulmod(cs,mu[now]));
}
}
for(rg int i=1;i<=mmax;i++){
cs=mmax/i;
s[i]=o;
o+=(cs+1);
for(rg int j=1;j<=cs;j++){
s[i][j]=addmod(s[i][j-1],phi[i*j]);
}
}
for(rg int i=1;i<=tp;i++){
for(rg int j=1;j<=tp;j++){
f[i][j]=o;
f[i][j][0]=0;
cs=std::min(mmax/i,mmax/j);
o+=(cs+1);
for(rg int k=1;k<=cs;k++){
f[i][j][k]=(addmod(f[i][j][k-1],mulmod(g[k],mulmod(s[k][i],s[k][j]))));
}
}
}
}
int t,n,m;
int main(){
mmax=1e5;
pre();
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
if(n>m) std::swap(n,m);
rg int nans=0,mmax=m/tp,orz1,orz2;
for(rg int i=1;i<=mmax;i++){
nans=addmod(nans,mulmod(g[i],mulmod(s[i][n/i],s[i][m/i])));
}
for(rg int l=mmax+1,r;l<=n;l=r+1){
r=std::min((n/(n/l)),m/(m/l)),orz1=n/l,orz2=m/l;
nans=addmod(nans,delmod(f[orz1][orz2][r],f[orz1][orz2][l-1]));
}
printf("%d\n",nans);
}
return 0;
}

loj #6179. Pyh 的求和 莫比乌斯反演的更多相关文章

  1. LOJ572. 「LibreOJ Round #11」Misaka Network 与求和 [莫比乌斯反演,杜教筛,min_25筛]

    传送门 思路 (以下令\(F(n)=f(n)^k\)) 首先肯定要莫比乌斯反演,那么可以推出: \[ ans=\sum_{T=1}^n \lfloor\frac n T\rfloor^2\sum_{d ...

  2. Loj #528. 「LibreOJ β Round #4」求和 (莫比乌斯反演)

    题目链接:https://loj.ac/problem/528 题目:给定两个正整数N,M,你需要计算ΣΣu(gcd(i,j))^2 mod 998244353 ,其中i属于[1,N],j属于[1,M ...

  3. 【XSY2754】求和 莫比乌斯反演 杜教筛

    题目描述 给你\(n,p\),求 \[ \sum_{i=1}^n\sum_{j=1}^i\sum_{k=1}^i\gcd(i,j,k)\mod p \] \(n\leq {10}^9\) 题解 \[ ...

  4. Wannafly Camp 2020 Day 3D 求和 - 莫比乌斯反演,整除分块,STL,杜教筛

    杜教筛求 \(\phi(n)\), \[ S(n)=n(n+1)/2-\sum_{d=2}^n S(\frac{n}{d}) \] 答案为 \[ \sum_{d=1}^n \phi(d) h(\fra ...

  5. 【LOJ#572】Misaka Network 与求和(莫比乌斯反演,杜教筛,min_25筛)

    [LOJ#572]Misaka Network 与求和(莫比乌斯反演,杜教筛,min_25筛) 题面 LOJ \[ans=\sum_{i=1}^n\sum_{j=1}^n f(gcd(i,j))^k\ ...

  6. LOJ# 572. 「LibreOJ Round #11」Misaka Network 与求和(min25筛,杜教筛,莫比乌斯反演)

    题意 求 \[ \sum_{i = 1}^{n} \sum_{i = 1}^{n} f(\gcd(i, j))^k \pmod {2^{32}} \] 其中 \(f(x)\) 为 \(x\) 的次大质 ...

  7. loj#6076「2017 山东一轮集训 Day6」三元组 莫比乌斯反演 + 三元环计数

    题目大意: 给定\(a, b, c\),求\(\sum \limits_{i = 1}^a \sum \limits_{j = 1}^b \sum \limits_{k = 1}^c [(i, j) ...

  8. 7.12 NOI模拟赛 积性函数求和 数论基础变换 莫比乌斯反演

    神题! 一眼powerful number 复习了一下+推半天. 可以发现G函数只能为\(\sum_{d}[d|x]d\) 不断的推 可以发现最后需要求很多块G函数的前缀和 发现只有\(\sqrt(n ...

  9. 莫比乌斯反演&各种筛法

    不学莫反,不学狄卷,就不能叫学过数论 事实上大概也不是没学过吧,其实上赛季头一个月我就在学这东西,然鹅当时感觉没学透,连杜教筛复杂度都不会证明,所以现在只好重新来学一遍了(/wq 真·实现了水平的负增 ...

随机推荐

  1. 【聊技术】在Android中实现自适应文本大小显示

    本周的聊技术话题和大家说说如何在Android中实现自适应文本大小显示. 想象一下,在布局中,通常显示文本的区域大小是固定的,但是文本长度并不总是固定的.比如列表中的文章标题.界面下方的按钮文本等等. ...

  2. UOJ61. 【UR #5】怎样更有力气

    题目链接 Statement 给定一棵 \(n\) 点树 \(T\) 和 \(m\) 个操作 v u w : 在 \(T\) 中 \(u,v\) 的最短路上所有点里面选出若干对(可以不选,可以重复), ...

  3. 膜 zhouakngyang 宝典

    持续更新! 注意:本文无 F12. about 周老师:怎么这么强! ZAKY 打 CF 大图:zaky cgr rk1 大图:zaky 传奇 \(1\) ZAKY 打 ATC ZAKY 切题

  4. P6007 [USACO20JAN]Springboards G

    本题解仅用与作者加深算法理解,也欢迎大家的阅读 做题背景 原本关于二维的点的 \(dp\) 问题一直都没有什么想法,昨天晚上再做一道 \(cdq\) 的题目的时候被同学询问了这道题,发现可以用二维偏序 ...

  5. OpenResty&Canal

    OpenResty&Canal OpenResty 提供缓存功能 封装了Nginx,并且提供了Lua扩展,大大提升了Nginx的并发处理能力10k~1000k Nginx限流 1.控制速率 2 ...

  6. uniapp-父组件数组变化同步子组件视图渲染

    项目中子组件封装的是一个picker,父组件需要传数组到子组件中. 如果父组件的数组出现变更,视图中的子组件或许不能直接刷新渲染,需要反复弹起几下才能看到. 试过深度监听,但都没有用,ref也不知道为 ...

  7. JavaSE17-File&递归&字节流

    1.File类 1.1 File类概述和构造方法 File类介绍 它是文件和目录路径名的抽象表示 文件和目录是可以通过File封装成对象的 对于File而言,其封装的并不是一个真正存在的文件,仅仅是一 ...

  8. ubuntu 16.04 编译安装 python3.9

    下载 python包 wget https://www.python.org/ftp/python/3.9.1/Python-3.9.1.tgz 解压 tar zxf Python-3.9.1.tgz ...

  9. UWP 自定义RadioButton实现Tab底部导航

    先看效果: 参照Android的实现方式用RadioButton来实现,但是Uwp的RadioButton并没有安卓的Selector选择器 下面是一个比较简单的实现,如果有同学有更好的实现,欢迎留言 ...

  10. kubernetes环境搭建 -k8s笔记(一)

    一.环境准备 1.硬件及版本信息: cpu&内存:2核心,2G 网络: 每台vm主机2块网卡,一块NAT用于上网,别一块配置成 "仅主机模式",网段为192.168.100 ...