P4240-毒瘤之神的考验【莫比乌斯反演,平衡规划】

1|0正题

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


1|1题目大意

Q组数据给出n,m

i=1nj=1mφ(i×j)

1Q104,1n,m105


1|2解题思路

首先需要知道的结论就是

φ(i×j)=φ(i)φ(j)gcd(i,j)φ(gcd(i,j))

然后推一下式子

i=1nj=1mφ(i)φ(j)gcd(i,j)φ(gcd(i,j))

d=1ndφ(d)d|ind|jmφ(i)φ(j)[gcd(i,j)=d]

然后莫反一波

d=1ndφ(d)z|dnμ(zd)z|inz|jmφ(i)φ(j)

提出z

z=1n(z|inφ(i)z|jmφ(j))d|zμ(zd)dφ(d)

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

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

fi,j=j|xiφ(x),然后再设一个hi,j,k

hi,j,k=x=T+1fi,j×fi,k×gi

这个可以用一个前缀和O(nnT2)的做到。

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

总共的时间复杂度是O(nn+nT2+Q(T+n))
T设为n23就是O(nn+n43+Qn23)了。


1|3code

// 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; }

__EOF__

本文作者QuantAsk
本文链接https://www.cnblogs.com/QuantAsk/p/14457371.html
关于博主:退役OIer,GD划水选手
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   QuantAsk  阅读(47)  评论(1编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示