洛谷 P4240 - 毒瘤之神的考验(数论+复杂度平衡)
先扯些别的。
2021 年 7 月的某一天,我和 ycx 对话:
- tzc:你做过哪些名字里带“毒瘤”的题目,我做过一道名副其实的毒瘤题就叫毒瘤,是个虚树+dp
- ycx:还有毒瘤之神的考验
- tzc:???那是个啥?
- ycx:一道数论水题
然后我便做到了这个题,然后却发现它一点也不水……
跑题了跑题了
首先我们显然不可能硬着头皮算 \(\varphi(ij)\),肯定要想办法将 \(\varphi(ij)\) 中的 \(i,j\) 独立开来。通过这题的套路可知 \(\varphi(ij)=\dfrac{\varphi(i)\varphi(j)\gcd(i,j)}{\varphi(\gcd(i,j))}\),于是下面我们就可以开始推式子了:
ans&=\sum\limits_{i=1}^n\sum\limits_{j=1}^m\varphi(ij)\\
&=\sum\limits_{i=1}^n\sum\limits_{j=1}^m\dfrac{\varphi(i)\varphi(j)\gcd(i,j)}{\varphi(\gcd(i,j))}\\
&=\sum\limits_{d=1}^{\min(n,m)}\dfrac{d}{\varphi(d)}\sum\limits_{d\mid i}\sum\limits_{d\mid j}\varphi(i)\varphi(j)[\gcd(i,j)=d]\\
&=\sum\limits_{d=1}^{\min(n,m)}\dfrac{d}{\varphi(d)}\sum\limits_{i=1}^{n/d}\sum\limits_{j=1}^{m/d}\varphi(id)\varphi(jd)[i\perp j]\\
&=\sum\limits_{d=1}^{\min(n,m)}\dfrac{d}{\varphi(d)}\sum\limits_{p=1}^{\min(n,m)/d}\mu(p)\sum\limits_{i=1}^{n/dp}\sum\limits_{j=1}^{m/dp}\varphi(idp)\varphi(jdp)
\end{aligned}
\]
如果我们记 \(f(n)=\sum\limits_{d\mid n}\dfrac{d}{\varphi(d)}·\mu(\dfrac{n}{d})\),\(S(n,m)=\sum\limits_{i=1}^m\varphi(ni)\),那么
ans&=\sum\limits_{T=1}^{\min(n,m)}f(T)S(T,\lfloor\dfrac{n}{T}\rfloor)S(T,\lfloor\dfrac{m}{T}\rfloor)
\end{aligned}
\]
\(f\) 显然可以调和级数地求出,有用的 \(S(n,m)\) 的个数也是 \(n\ln n\) 级别的,因此暴力计算上式可实现 \(Tn+n\ln n\) 的复杂度,无法通过。直接整除分块看起来不太容易的亚子,这就使我们陷入了一个比较尴尬的局面。但是一个非常直观的 observation 是当 \(T\) 比较大时,可能的 \((\lfloor\dfrac{n}{T}\rfloor,\lfloor\dfrac{m}{T}\rfloor)\) 组成的二元组并不是特别多。因此考虑从这个角度入手。记 \(B=316\),对于 \(T\le B\),我们暴力计算即可,对于 \(T>B\),写个程序算一下可以发现 \(\sum\limits_{i=317}^{10^5}\lfloor\dfrac{10^5}{i}\rfloor^2\) 只有大概 \(3\times 10^7\) 的样子,因此这部分我们就预处理时,暴力枚举所有可能的 \((\lfloor\dfrac{n}{T}\rfloor,\lfloor\dfrac{m}{T}\rfloor)\),然后前缀和算一下贡献,这样每次询问整除分块即可求出这部分 \(T\) 的贡献。
时间复杂度 \(T\sqrt{n}+n\sqrt{n}+n\ln n\),可以通过。
const int MAXN=1e5;
const int B=316;
int inv[MAXN+5],pr[MAXN/7+5],prcnt=0,phi[MAXN+5],vis[MAXN+5],f[MAXN+5],mu[MAXN+5];
vector<int> s[MAXN+5],ss[B+4][B+4];
void init(){
for(int i=(inv[0]=inv[1]=1)+1;i<=MAXN;i++) inv[i]=1ll*inv[MOD%i]*(MOD-MOD/i)%MOD;
phi[1]=mu[1]=1;
for(int i=2;i<=MAXN;i++){
if(!vis[i]) phi[i]=i-1,mu[i]=-1,pr[++prcnt]=i;
for(int j=1;j<=prcnt&&pr[j]*i<=MAXN;j++){
vis[pr[j]*i]=1;
if(i%pr[j]==0){phi[i*pr[j]]=phi[i]*pr[j];break;}
phi[i*pr[j]]=phi[i]*phi[pr[j]];mu[i*pr[j]]=-mu[i];
}
}
for(int i=1;i<=MAXN;i++) for(int j=i;j<=MAXN;j+=i)
f[j]=(0ll+f[j]+1ll*i*inv[phi[i]]%MOD*mu[j/i]%MOD+MOD)%MOD;
for(int i=1;i<=MAXN;i++){
s[i].resize(MAXN/i+1);
for(int j=1;j<=MAXN/i;j++) s[i][j]=(s[i][j-1]+phi[i*j])%MOD;
}
for(int i=1;i<=B+1;i++) for(int j=1;j<=B+1;j++){
ss[i][j].pb(0);int sum=0;
for(int k=B+1;k<=MAXN;k++){
if(k*i>MAXN||k*j>MAXN) break;
sum=(sum+1ll*f[k]*s[k][i]%MOD*s[k][j])%MOD;
ss[i][j].pb(sum);
}
}
}
int main(){
init();int qu;scanf("%d",&qu);
while(qu--){
int n,m;scanf("%d%d",&n,&m);int res=0;
for(int i=1;i<=B;i++) res=(res+1ll*f[i]*s[i][n/i]%MOD*s[i][m/i])%MOD;
for(int l=B+1,r;l<=min(n,m);l=r+1){
r=INF;
if(n/l) chkmin(r,n/(n/l));
if(m/l) chkmin(r,m/(m/l));
res=(0ll+res+ss[n/l][m/l][r-B]-ss[n/l][m/l][l-B-1]+MOD)%MOD;
}
printf("%d\n",res);
}
return 0;
}
洛谷 P4240 - 毒瘤之神的考验(数论+复杂度平衡)的更多相关文章
- 洛谷 P4240 毒瘤之神的考验 解题报告
P4240 毒瘤之神的考验 题目背景 \(\tt{Salamander}\)的家门口是一条长长的公路. 又是一年春天将至,\(\tt{Salamander}\)发现路边长出了一排毒瘤! \(\tt{S ...
- 洛谷P4240 毒瘤之神的考验 【莫比乌斯反演 + 分块打表】
题目链接 洛谷P4240 题解 式子不难推,分块打表真的没想到 首先考虑如何拆开\(\varphi(ij)\) 考虑公式 \[\varphi(ij) = ij\prod\limits_{p | ij} ...
- P4240 毒瘤之神的考验
题目 P4240 毒瘤之神的考验 神仙题\(emmm\) 前置 首先有一个很神奇的性质: \(\varphi(ij)=\dfrac{\varphi(i)\varphi(j)gcd(i,j)}{\var ...
- 从 [P4240 毒瘤之神的考验] 谈 OI 中的美学
感觉这题真的特别有意思,涉及了 OI 中很多非常有意思.非常美的手法,比如--平衡两部分的时间复杂度.\(n \ln n\) 的那个 Trick等等,真的一种暴力的美学. 题目大意: 多组询问,求 \ ...
- 洛谷P1774 最接近神的人_NOI导刊2010提高(02)(求逆序对)
To 洛谷.1774 最接近神的人 题目描述 破解了符文之语,小FF开启了通往地下的道路.当他走到最底层时,发现正前方有一扇巨石门,门上雕刻着一幅古代人进行某种活动的图案.而石门上方用古代文写着“神的 ...
- [NOI导刊2010提高&洛谷P1774]最接近神的人 题解(树状数组求逆序对)
[NOI导刊2010提高&洛谷P1774]最接近神的人 Description 破解了符文之语,小FF开启了通往地下的道路.当他走到最底层时,发现正前方有一扇巨石门,门上雕刻着一幅古代人进行某 ...
- 洛谷P2783 有机化学之神偶尔会作弊
题目传送门 啦啦啦,发个文纪念一下第一道在洛谷上A的黑题,一次性就过真是无比舒服-(虽然某些大佬说这题有点水……)题目其实思路不难,Tarjan缩点+LCA,不过因为是无向边,所以在Tarjan的时候 ...
- [luogu 4240] 毒瘤之神的考验
题目背景 Salamander的家门口是一条长长的公路. 又是一年春天将至,Salamander发现路边长出了一排毒瘤! Salamander想带一些毒瘤回家,但是,这时毒瘤当中钻出来了一个毒瘤之神! ...
- 洛谷 P6783 - [Ynoi2008] rrusq(KDT+势能均摊+根号平衡)
洛谷题面传送门 首先显然原问题严格强于区间数颜色,因此考虑将询问离线下来然后用某些根号级别复杂度的数据结构.按照数颜色题目的套路,我们肯定要对于每种颜色维护一个前驱 \(pre\),那么答案可写作 \ ...
随机推荐
- Less-32 宽字节
<!-- 下午整了半天Less-29~31,愣是没调好jsp环境,只好跳过. 难受.jpg !--> Less-32: 核心语句: 各种回显均存在. 第一句话指定了字符集为gbk. che ...
- JAVA String、StringBuffer、StringBuilder类解读
JAVA String.StringBuffer.StringBuilder类解读 字符串广泛应用 在 Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作 ...
- [no code][scrum meeting] Alpha 9
项目 内容 会议时间 2020-04-15 会议主题 OCR验收 会议时长 15min 参会人员 OCR组成员 $( "#cnblogs_post_body" ).catalog( ...
- SpringCloud微服务实战——搭建企业级开发框架(八):使用注解校验微服务消息参数
平时开发过程中,经常要用到参数校验,如果直接在代码逻辑里面写参数校验,代码有点冗余且用起来不是非常方便,显得代码逻辑复杂且重复代码太多,这里我们使用注解的方式进行参数校验,SpringBoot中常 ...
- 进阶区forgotg攻防世界
攻防世界进阶区--forgot 前言,这题中看不中用啊宝友!!! 1.查看保护 第一反应就是蛮简单的,32位. 2.获取信息(先运行程序看看) 装的可以,蛮多的东西. 但是就是中看不中用 3.ida ...
- Java并发:重入锁 ReentrantLock(一)
ReentrantLock 是一种可重入的互斥锁,它不像 synchronized关键字一样支持隐式的重进入,但能够使一个线程(不同的方法)重复对资源的重复加锁而不受阻塞. ReentrantLock ...
- linux shell 提示符
当我们打开或者登陆到一个终端的时候都会显示一长串提示符 void@void-ThinkPad-E450:~$ 提示符一般包含当前登陆的用户名 ,主机名,以及当前工作路径路径,最后都是以 $ 或者 # ...
- hdu 5087 Revenge of LIS II (DP)
题意: N个数,求第二长上升子序列的长度. 数据范围: 1. 1 <= T <= 1002. 2 <= N <= 10003. 1 <= Ai <= 1 000 0 ...
- 记一次排查CPU高的问题
背景 将log4j.xml的日志级别从error调整为info后,进行压测发现CPU占用很高达到了90%多(之前也就是50%,60%的样子). 问题排查 排查思路: 看进程中的线程到底执行的是什么, ...
- 【Go语言学习笔记】为什么要选择Go语言
一门语言的兴起一定有他的原因,所谓天下苦Java久矣,Go的到来可以说很多后端开发的福音,尤其是在微服务.分布式这么火的今天,那么,他的优势到底是什么呢? 首先,我们需要现有后端语言的优势痛点: 其实 ...