[luogu 4240] 毒瘤之神的考验
题目背景
Salamander的家门口是一条长长的公路。
又是一年春天将至,Salamander发现路边长出了一排毒瘤!
Salamander想带一些毒瘤回家,但是,这时毒瘤当中钻出来了一个毒瘤之神!
毒瘤之神:你想要带毒瘤走吗?想要带走毒瘤,就必须回答我的问题!如果答不出来的话,你还是乖乖回家吧!
题目描述
毒瘤之神会问T次,每次给定n,m,Salamander需要回答出\(\sum_{i=1}^n\sum_{j=1}^m\varphi(ij)\ mod\ 998244353\)。
Salamander这么辣鸡当然不会做啦,于是把问题丢给了你。
输入输出格式
输入格式:
第一行包含一个正整数T。
接下来T行,每行包含两个正整数,用空格隔开,表示这次询问的n,m。
输出格式:
包含T行每行一个整数表示答案。
输入输出样例
输入样例#1:
3
1 1
2 2
3 3
输出样例#1:
1
5
19
Solution
神奇的反演题。。
首先有一个比较显然的性质:
\]
证明对于每个质因子考虑就行了。
然后带进去莫比乌斯反演:
ans=&\sum_{i=1}^{n}\sum_{j=1}^m\frac{\varphi(i)\varphi(j)\gcd(i,j)}{\varphi(\gcd(i,j))}\\
=&\sum_{T=1}^{\min(n,m)}\sum_{d|T}\frac{d}{\varphi(d)}\cdot \mu(\frac{T}{d}) \sum_{i=1}^{\lfloor\frac{n}{T}\rfloor}\varphi(iT)\sum_{j=1}^{\lfloor\frac{m}{T}\rfloor}\varphi(jT)
\end{align}
\]
设:
\]
显然这玩意可以\(O(n\log n)\)预处理出来。
对于后面那个,设:
\]
然后因为\(n\cdot T\leqslant 1e5\),所以总共只有\(O(n\log n)\)个值,动态开内存预处理出来就行。
答案变成了:
\]
答案是一个数论分块的形式,设:
\]
然后我们预处理出\(n,m\leqslant B\)的值,这里先设一个\(B\)出来,现在并不知道他是多少。
然后分析下复杂度,此时\(ans\)里的\(T\geqslant n/B\),所以对于\(T \leqslant n/B\)的直接暴力来算出就好了,剩下的数论分块之后利用\(h\)减一下就好了。
时间复杂度为\(O(n\log n+B^2n+T(\sqrt{n}+\lfloor\frac{n}{B}\rfloor))\)。
取最小值即\(B^2n=T\cdot \frac{n}{B}\),解得\(B=\sqrt[3]{T}\thickapprox 30\)。
#include<bits/stdc++.h>
using namespace std;
void read(int &x) {
x=0;int f=1;char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-f;
for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';x*=f;
}
void print(int x) {
if(x<0) putchar('-'),x=-x;
if(!x) return ;print(x/10),putchar(x%10+48);
}
void write(int x) {if(!x) putchar('0');else print(x);putchar('\n');}
#define pb push_back
const int maxn = 1e5+10;
const int B = 30;
const int mod = 998244353;
int pri[maxn],mu[maxn],vis[maxn],tot,f[maxn],phi[maxn],inv[maxn];
vector <int > g[maxn],h[B+1][B+1];
void prepare(int n) {
mu[1]=inv[1]=phi[1]=1;
for(int i=2;i<=n;i++) {
if(!vis[i]) mu[i]=-1,pri[++tot]=i,phi[i]=i-1;
for(int j=1;j<=tot&&i*pri[j]<=n;j++) {
vis[i*pri[j]]=1;
if(i%pri[j]==0) {phi[i*pri[j]]=phi[i]*pri[j];break;}
mu[i*pri[j]]=-mu[i];
phi[i*pri[j]]=phi[i]*(pri[j]-1);
}
inv[i]=1ll*(mod-mod/i)*inv[mod%i]%mod;
}
for(int d=1;d<=n;d++)
for(int T=d;T<=n;T+=d)
f[T]=(f[T]+1ll*d*inv[phi[d]]%mod*mu[T/d])%mod;
for(int i=0;i<=n;i++) g[0].pb(0);
for(int i=1;i<=n;i++) {
int l=(n/i);g[i].pb(0);
for(int j=1;j<=l;j++)
g[i].pb((g[i-1][j]+phi[i*j])%mod);
}
for(int i=1;i<=B;i++)
for(int j=1;j<=B;j++) {
int l=min(n/i,n/j);h[i][j].pb(0);
for(int k=1;k<=l;k++)
h[i][j].pb((h[i][j][k-1]+1ll*f[k]*g[i][k]%mod*g[j][k]%mod)%mod);
}
}
void solve() {
int n,m;read(n),read(m);if(n>m) swap(n,m);
int ans=0;
for(int i=1;i<=m/B;i++) ans=(ans+1ll*f[i]*g[n/i][i]%mod*g[m/i][i]%mod)%mod;
int T=m/B+1;
while(T<=n) {
int pre=T;T=min(n/(n/T),m/(m/T));
ans=(1ll*(ans+h[n/T][m/T][T])-h[n/T][m/T][pre-1])%mod;T++;
}write((ans+mod)%mod);
}
int main() {
prepare(100000);
int t;read(t);
while(t--) solve();
return 0;
}
[luogu 4240] 毒瘤之神的考验的更多相关文章
- luogu 4240 毒瘤之神的考验 (莫比乌斯反演)
题目大意:略 题面传送门 果然是一道神duliu题= = 出题人的题解传送门 出题人的题解还是讲得很明白的 1.关于$\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m ...
- 洛谷 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:毒瘤之神的考验
传送门 Sol 分开考虑 \(\varphi(ij)\) 中 \(ij\) 的质因子 那么 \[\varphi(ij)=\frac{\varphi(i)\varphi(j)gcd(i,j)}{\var ...
- 从 [P4240 毒瘤之神的考验] 谈 OI 中的美学
感觉这题真的特别有意思,涉及了 OI 中很多非常有意思.非常美的手法,比如--平衡两部分的时间复杂度.\(n \ln n\) 的那个 Trick等等,真的一种暴力的美学. 题目大意: 多组询问,求 \ ...
- 洛谷P4240 毒瘤之神的考验 【莫比乌斯反演 + 分块打表】
题目链接 洛谷P4240 题解 式子不难推,分块打表真的没想到 首先考虑如何拆开\(\varphi(ij)\) 考虑公式 \[\varphi(ij) = ij\prod\limits_{p | ij} ...
- luogu4240 毒瘤之神的考验(毒瘤乌斯反演)
link 题意:求出\(\sum_{i=1}^n\sum_{j=1}^m\varphi(ij)\),对998244353取模 多组数据,\(T\le 10^4,n,m\le 10^5\). 前置知识: ...
- Luogu4240 毒瘤之神的考验 莫比乌斯反演、根号分治
传送门 首先有\(\varphi(ij) = \frac{\varphi(i) \varphi(j) \gcd(i,j)}{\varphi(\gcd(i,j))}\),把欧拉函数的定义式代入即可证明 ...
随机推荐
- SqlServer2008/2005数据库日志收缩
1.SQL2008数据库USE [master]GOALTER DATABASE 数据库名称 SET RECOVERY SIMPLE WITH NO_WAITALTER DATABASE 数据库名称 ...
- Linux crontab 实现秒级定时任务
1 crontab 的延时: 原理:通过延时方法 sleep N 来实现每N秒执行. crontab -e 输入以下语句,然后 :wq 保存退出. * * * * * /usr/bin/curl ...
- python__系统 : socket_TCP相关
tcp和udp对比起来.还是tcp相对稳定一些,但是因为有三次挥手和四次握手,以及确认包(ack)的存在,可能在速度上会比udp慢. 用python的socket模块可以建立tcp服务端: from ...
- 1016-06-首页20-封装工具条---UITableView控件距离顶部的间距问题----cell选中时的背景颜色设置
一.设置UITableView里面的顶部 cell 距离顶部的间距的三种方式: 方法 1. 直接设置: self.tableView.contentInset = UIEdgeInsetsMake(H ...
- C语言进阶——循环语句07
循环语句的基本工作方式: 通过条件表达式判定是否执行循环体 条件表达式遵循if语句表达式的原则 do,while,for的区别: do语句先执行后判断,循环体至少执行一次 while语句先判断后执行, ...
- 012---Django的用户认证组件
知识预览 用户认证 回到顶部 用户认证 auth模块 ? 1 from django.contrib import auth django.contrib.auth中提供了许多方法,这里主要介绍其中的 ...
- android onNewIntent 为什么要在onNewIntent的时候要显示的去调用setIntent
原因: 当调用到onNewIntent(intent)的时候,需要在onNewIntent() 中使用setIntent(intent)赋值给Activity的Intent.否则,后续的getInte ...
- Java-JNA使用心得
自上个月20号,历时整整一个月,终于找到工作入职了. 然后这段时间一直看公司的框架还有业务方面的东西.其实由于给分配了一个研究Java调用C语言接口的问题,导致框架业务方面的东西还不熟,然后现在手上又 ...
- HNOI2018 摸鱼记
HNOI2018 摸鱼记 今天我又来记流水账啦 Day 0 颓废的一天. 我,球爷和杜教在颓膜膜.io ych看起来在搓碧蓝 鬼知道哥达鸭干了什么 学习氛围只局限在机房的一角 后来全体Oier开会,5 ...
- laravel5.5事件系统
目录 1 注册事件和监听器 2 定义事件 3 定义监听器 4 分发事件 更多使用方法 1. 可以手动注册事件 2. 事件监听器中调用队列 3.事件订阅者 1 注册事件和监听器 1.修改EventSer ...