P6222-「P6156 简单题」加强版【莫比乌斯反演】
正題
題目鏈接:https://www.luogu.com.cn/problem/P6222
題目大意
給出kkk,TTT組詢問給出nnn求
∑i=1n∑j=1n(i+j)k×gcd(i,j)×μ(gcd(i,j))2\sum_{i=1}^n\sum_{j=1}^n(i+j)^k\times gcd(i,j)\times \mu(gcd(i,j))^2i=1∑n?j=1∑n?(i+j)k×gcd(i,j)×μ(gcd(i,j))2
解題思路
開始忘記了kkk次冪能線性篩后面全推錯了,既然可以線性篩kkk次冪就把gcd(i,j)gcd(i,j)gcd(i,j)提到前面來。
∑d=1nμ(d)2d∑i=1n∑j=1n[gcd(i,j)=d](i+j)k\sum_{d=1}^n\mu(d)^2d\sum_{i=1}^n\sum_{j=1}^n[gcd(i,j)=d](i+j)^kd=1∑n?μ(d)2di=1∑n?j=1∑n?[gcd(i,j)=d](i+j)k
這里有一個比較巧妙的思路就是,可以把μ(d)2d\mu(d)^2dμ(d)2d提前莫反之后一起套進莫反里。
設有
∑d∣ng(d)=μ(n)2n?g(n)=∑d∣nμ(nd)μ(d)2d\sum_{d|n}g(d)=\mu(n)^2n\Rightarrow g(n)=\sum_{d|n}\mu(\frac{n}ozvdkddzhkzd)\mu(d)^2dd∣n∑?g(d)=μ(n)2n?g(n)=d∣n∑?μ(dn?)μ(d)2d
然后莫反原式就有一個比較簡單的式子了
∑d=1ng(d)dk∑i=1?nd?∑j=1?nd?(i+j)k\sum_{d=1}^ng(d)d^k\sum_{i=1}^{\lfloor\frac{n}ozvdkddzhkzd\rfloor}\sum_{j=1}^{\lfloor\frac{n}ozvdkddzhkzd\rfloor}(i+j)^kd=1∑n?g(d)dki=1∑?dn???j=1∑?dn???(i+j)k
設S(n)=∑i=1n∑j=1n(i+j)kS(n)=\sum_{i=1}^n\sum_{j=1}^n(i+j)^kS(n)=∑i=1n?∑j=1n?(i+j)k,這個東西是可以線性預處理的。
先預線性篩+前綴和處理出s(n)=∑i=1niks(n)=\sum_{i=1}^ni^ks(n)=∑i=1n?ik,就有S(n)=(∑i=n+12ns(i))?(∑i=1ns(i))S(n)=\left(\sum_{i=n+1}^{2n}s(i)\right)-\left(\sum_{i=1}^ns(i)\right)S(n)=(∑i=n+12n?s(i))?(∑i=1n?s(i)),再用一個前綴和就好了。
然后就有式子
∑d=1ng(d)dkS(?nd?)\sum_{d=1}^ng(d)d^kS(\lfloor\frac{n}ozvdkddzhkzd\rfloor)d=1∑n?g(d)dkS(?dn??)
這個知道怎么篩g(d)dkg(d)d^kg(d)dk之后好像就可以O(Tn)O(T\sqrt n)O(Tn?)做了?發現ggg里面有個nnn還是很難搞。
然后可以一頓操作把下取整搞掉,設S′(x)=S(x)?S(x?1)S'(x)=S(x)-S(x-1)S′(x)=S(x)?S(x?1),那么就有
∑d=1ng(d)dk∑i=1?nd?S′(i)\sum_{d=1}^ng(d)d^k\sum_{i=1}^{\lfloor\frac{n}ozvdkddzhkzd\rfloor}S'(i)d=1∑n?g(d)dki=1∑?dn???S′(i)
然后把iii提出來就有
∑i=1n∑d∣ig(d)dkS′(nd)\sum_{i=1}^n\sum_{d|i}g(d)d^kS'(\frac{n}ozvdkddzhkzd)i=1∑n?d∣i∑?g(d)dkS′(dn?)
然后就會發現這是兩個函數狄利克雷卷積的前綴和?
f(n)=g(n)nk=nk∑d∣nμ(nd)μ(d)2df(n)=g(n)n^k=n^k\sum_{d|n}\mu(\frac{n}ozvdkddzhkzd)\mu(d)^2df(n)=g(n)nk=nk∑d∣n?μ(dn?)μ(d)2d是積性函數,所以我們可以用埃氏篩的方法來快速搞這個東西。
首先我們需要知道對于一個質數ppp,f(pe)f(p^e)f(pe)如何快速計算。
這里是有結論的
- 若e=0e=0e=0則f(p0)=f(1)=1f(p^0)=f(1)=1f(p0)=f(1)=1
- 若e=1e=1e=1則f(p1)=p×(1×μ(1)2μ(p)+p×μ(1)μ(p)2)=p(p?1)f(p^1)=p\times (1\times \mu(1)^2\mu(p)+p\times \mu(1)\mu(p)^2)=p(p-1)f(p1)=p×(1×μ(1)2μ(p)+p×μ(1)μ(p)2)=p(p?1)
- 若e=2e=2e=2則f(p2)=p2×(μ(p2)μ(1)2+μ(p)μ(p)2p+μ(1)μ(p2)2p2)=?p2f(p^2)=p^2\times (\mu(p^2)\mu(1)^2+\mu(p)\mu(p)^2p+\mu(1)\mu(p^2)^2p^2)=-p^2f(p2)=p2×(μ(p2)μ(1)2+μ(p)μ(p)2p+μ(1)μ(p2)2p2)=?p2
- 若e≥3e\geq 3e≥3那么若μ(d)≠0\mu(d)\neq0μ(d)?=0那么一定有μ(nd)=0\mu(\frac{n}ozvdkddzhkzd)=0μ(dn?)=0,所以f(pe)=0f(p^e)=0f(pe)=0
然后就可以開始做了,怎么快速計算狄利克雷卷積?埃氏篩給過我們方法,對于一個積性函數fff,我們可以拆成若干個fpf_pfp?滿足
fp(x)=[pe=x]f(x)(p∈Pri)f_p(x)=[p^e=x]f(x)\ \ (p\in Pri)fp?(x)=[pe=x]f(x)??(p∈Pri)
(PriPriPri是質數集)
然后有f=∏p∈Prifpf=\prod_{p\in Pri}f_pf=∏p∈Pri?fp?(乘法表示狄利克雷積)
所以把所有的fpf_pfp?乘到S′S'S′里去就好了,這個是枚舉所有質數的倍數來搞的,時間復雜度O(nlog?log?n)O(n\log \log n)O(nloglogn)
所以總共的時間復雜度就是O(T+nlog?log?n)O(T+n\log \log n)O(T+nloglogn)
code
#include<cstdio> #include<cstring> #include<algorithm> #define uit unsigned int using namespace std; const int N=2e7+10; int t,n,k,cnt; uit pri[N],pw[N],s[N]; bool v[N]; uit power(uit x,int b){uit ans=1;while(b){if(b&1)ans=ans*x;x=x*x;b>>=1;}return ans; } void init(){s[1]=1;for(int i=2;i<=n*2;i++){if(!v[i])pri[++cnt]=i,s[i]=power(i,k);for(int j=1;j<=cnt&&i*pri[j]<=n*2;j++){v[i*pri[j]]=1;s[i*pri[j]]=s[i]*s[pri[j]];if(i%pri[j]==0)break;}}for(int i=1;i<=n*2;i++)pw[i]=s[i],s[i]=s[i-1]+s[i];for(int i=1;i<=n;i++)s[i]=s[i*2]+s[i*2-1]-s[i]*2;for(int j=1;j<=cnt&&pri[j]<=n;j++)for(int x=pri[j],i=n/x;i>=1;i--){s[i*x]+=s[i]*(x-1)*pw[x];if(i%x==0)s[i*x]-=s[i/x]*x*pw[x]*pw[x];}for(int i=1;i<=n;i++)s[i]+=s[i-1];return; } int main() {scanf("%d%d%d",&t,&n,&k);init();while(t--){scanf("%d",&n);printf("%u\n",s[n]);}return 0; }總結
以上是生活随笔為你收集整理的P6222-「P6156 简单题」加强版【莫比乌斯反演】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中国登山队首次登上珠穆朗玛峰有谁 登上珠
- 下一篇: P4198-楼房重建【线段树】