P4240-毒瘤之神的考验【莫比乌斯反演,平衡规划】
正題
題目鏈接:https://www.luogu.com.cn/problem/P4240
題目大意
QQQ組數據給出n,mn,mn,m求
∑i=1n∑j=1mφ(i×j)\sum_{i=1}^n\sum_{j=1}^m\varphi(i\times j)i=1∑n?j=1∑m?φ(i×j)
1≤Q≤104,1≤n,m≤1051\leq Q\leq 10^4,1\leq n,m\leq 10^51≤Q≤104,1≤n,m≤105
解題思路
首先需要知道的結論就是
φ(i×j)=φ(i)φ(j)gcd(i,j)φ(gcd(i,j))\varphi(i\times j)=\varphi(i)\varphi(j)\frac{gcd(i,j)}{\varphi(gcd(i,j))}φ(i×j)=φ(i)φ(j)φ(gcd(i,j))gcd(i,j)?
然后推一下式子
∑i=1n∑j=1mφ(i)φ(j)gcd(i,j)φ(gcd(i,j))\sum_{i=1}^n\sum_{j=1}^m\varphi(i)\varphi(j)\frac{gcd(i,j)}{\varphi(gcd(i,j))}i=1∑n?j=1∑m?φ(i)φ(j)φ(gcd(i,j))gcd(i,j)?
∑d=1ndφ(d)∑d∣in∑d∣jmφ(i)φ(j)[gcd(i,j)=d]\sum_{d=1}^n\fracze8trgl8bvbq{\varphi(d)}\sum_{d|i}^n\sum_{d|j}^m\varphi(i)\varphi(j)[gcd(i,j)=d]d=1∑n?φ(d)d?d∣i∑n?d∣j∑m?φ(i)φ(j)[gcd(i,j)=d]
然后莫反一波
∑d=1ndφ(d)∑z∣dnμ(zd)∑z∣in∑z∣jmφ(i)φ(j)\sum_{d=1}^n\fracze8trgl8bvbq{\varphi(d)}\sum_{z|d}^n\mu(\frac{z}ze8trgl8bvbq)\sum_{z|i}^n\sum_{z|j}^m\varphi(i)\varphi(j)d=1∑n?φ(d)d?z∣d∑n?μ(dz?)z∣i∑n?z∣j∑m?φ(i)φ(j)
提出zzz來
∑z=1n(∑z∣inφ(i)∑z∣jmφ(j))∑d∣zμ(zd)dφ(d)\sum_{z=1}^n(\sum_{z|i}^n\varphi(i)\sum_{z|j}^m\varphi(j))\sum_{d|z}\mu(\frac{z}ze8trgl8bvbq)\fracze8trgl8bvbq{\varphi(d)}z=1∑n?(z∣i∑n?φ(i)z∣j∑m?φ(j))d∣z∑?μ(dz?)φ(d)d?
后面那個很好求,線性篩然后O(nlog?n)O(n\log n)O(nlogn)處理就好了,并且設為gig_igi?,后面需要用到。但是前面那個比較麻煩,而且我們好像就推不動了。
這其實是一個挺經典的tracktracktrack的,考慮平衡規劃。設定一個TTT,對于小于等于TTT的部分我們暴力算,對于大于TTT的部分我們考慮預處理。
設fi,j=∑j∣xiφ(x)f_{i,j}=\sum_{j|x}^i\varphi(x)fi,j?=∑j∣xi?φ(x),然后再設一個hi,j,kh_{i,j,k}hi,j,k?
hi,j,k=∑x=T+1fi,j×fi,k×gih_{i,j,k}=\sum_{x=T+1}f_{i,j}\times f_{i,k}\times g_{i}hi,j,k?=x=T+1∑?fi,j?×fi,k?×gi?
這個可以用一個前綴和O(nnT2)O(n\frac{n}{T}^2)O(nTn?2)的做到。
然后大于TTT的部分我們就可以用上面預處理的hhh+整除分塊做到O(n)O(\sqrt n)O(n?)了。
總共的時間復雜度是O(nn+nT2+Q(T+n))O(n\sqrt n+nT^2+Q(T+\sqrt n))O(nn?+nT2+Q(T+n?))
將TTT設為n23n^{\frac{2}{3}}n32?就是O(nn+n43+Qn23)O(n\sqrt n+n^{\frac{4}{3}}+Qn^{\frac{2}{3}})O(nn?+n34?+Qn32?)了。
code
#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-毒瘤之神的考验【莫比乌斯反演,平衡规划】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 停止向45岁以上外卖骑手派单?美团辟谣
- 下一篇: “ChatGPT之父”剑桥演讲遭抵制,学