日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

省选前的反演抢救计划

發布時間:2025/7/14 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 省选前的反演抢救计划 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

RT,熟悉的標題

表示開始搶救的時候關于反演的那一套已經快忘完了

然而沙茶博主做反演題的過程基本就是:看題->xjb推->推不動->看題解

主要是莫比烏斯反演,有空就再搞搞二項式反演

同樣不建議......

我佛了


莫比烏斯反演那一套理論.jpg

同時涉及一些數論相關?

萬惡之源:

狄利克雷卷積函數:$(f×g)(n)=\sum_{d|n}f(d)g(\frac{n}ozvdkddzhkzd)$。

基本結論

1 x 1 = d,證明:定義

φ x 1 = id,證明:若n為質數,則id。其他情況用積性函數證明。

μ x id = φ,證明:上面那個東西莫比烏斯反演一下

μ x 1 = ε,證明:考慮每個質數選幾個,用二項式定理確定系數,帶進去后發現和為0。

ε × 1 = 1,證明:每個數為1的因數只有1,顯然

元函數e和誰卷得出來的都是那個函數

整除的性質

$\left\lfloor \frac{n}{a*b} \right\rfloor=\left\lfloor?\frac{\left\lfloor \frac{n}{a} \right\rfloor}{b}?\right\rfloor$,向上取整同理

莫比烏斯反演定理

$g(n)=\sum_{d|n}f(d)->f(n)=\sum_{d|n}μ(\frac{n}ozvdkddzhkzd)g(d)$

常用技巧

1.數論分塊

大部分時候從本質上降低復雜度的是數論分塊

注意有限制時被限制的部分不能放進分塊里

2.gcd

①枚舉gcd

②gcd和lcm的關系,其實反演里所有的lcm歸根結底都是gcd

③d|gcd(a,b)當且僅當d|a&&d|b,gcd(a*b,c)==1當且僅當$gcd(a,c)==1\&\&gcd(b,c)==1$

④設$f(d)=\sum_{d==gcd(i,j)}$,$g(n)=\sum_{d|gcd(i,j)}$,那么$g(d)=\left\lfloor\frac{n}ozvdkddzhkzd\right\rfloor\left\lfloor\frac{m}ozvdkddzhkzd\right\rfloor$

3.交換求和號

基本技能,字面意思

4.枚舉整體/前提枚舉/改變枚舉對象

前面的是一個套路的東西,比如枚舉一個乘積或者枚舉一個下取整除法

中間那個那個經常提μ或者題目給的一個函數,還有注意前提時指數的變化

(前提枚舉->向前提取枚舉的某一項)

后者靈活用就好(指xjb用)

5.xjb使用基本結論和莫反定理,哦,還有一些函數的本質定義以及數論中的其他小知識

當別的技巧都沒有用的時候,總可以用更基本的東西試一試

6.特別的一些技巧

對于除式,可以考慮分子分母分開算

對于帶著邏輯運算符的式子,可以考慮按邏輯運算來拆開算

有時候可能需要線性篩預處理積性函數

常見的(反演)結果

1D GCD

$\sum\limits_{i=1}^{n}gcd(i,n)=\sum\limits_{i=1}^{n}\sum_{d|gcd(i,n)}φ(d)=\sum_{d|n}φ(d)\frac{n}ozvdkddzhkzd$

2D GCD

$\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}gcd(i,j)=\sum\limits_{d=1}^{min(n,m)}φ(d)\left\lfloor\frac{n}ozvdkddzhkzd\right\rfloor \left\lfloor\frac{m}ozvdkddzhkzd\right\rfloor$

GCD=k

$\sum\limits_{i=1}^n\sum\limits_{j=1}^m[gcd(i,j)==k]=\sum\limits_{i=1}^{min(n,m)}[k|i]μ(\frac{i}{k})\left\lfloor\frac{n}{i}\right\rfloor\left\lfloor\frac{m}{i}\right\rfloor=\sum\limits_{i=1}^{min(\left\lfloor\frac{n}{k}\right\rfloor,\left\lfloor\frac{m}{k}\right\rfloor)}μ(i)\left\lfloor\frac{n}{ik}\right\rfloor\left\lfloor\frac{m}{ik}\right\rfloor$

1D LCM

$\sum\limits_{i=1}^nlcm(i,n)=\sum\limits_{i=1}^nn\frac{i}{gcd(i,n)}$

枚舉$gcd(i,n)$

$\sum_{d|n}\frac{\sum i[gcd(i,n)==d]}ozvdkddzhkzd=\sum_{d|n}\sum_{j=1}^{\frac{n}ozvdkddzhkzd}j=$自行等差數列求和

2D 互質數對乘積和

$\sum\limits_{i=1}^n i^2φ(i)$


題!實踐!推式子!

我反正是復習的時候把寫過的反演題又推了一遍,沒寫過題解的就放這里了

?

一些之前做過的題(混進來一個二項式反演),修了好多原來naive的鍋

?

國家集訓隊 Crash的數字表格?

求$\sum\limits_{i=1}^n\sum\limits_{j=1}^mlcm(i,j)$,單次詢問

(加強版是多次詢問,再推一推用線性篩積性函數可以做到$O(n+T\sqrt n)$,一定寫)

這題用到的技巧很多,適合熟悉莫反

— —所有的lcm歸根結底都是gcd

$\sum\limits_{i=1}^n\sum\limits_{j=1}^mlcm(i,j)$

$\sum\limits_{i=1}^n\sum\limits_{j=1}^m\frac{i*j}{gcd(i,j)}$

枚舉+前提gcd,下設$n<=m$

$\sum\limits_{d=1}^n\sum\limits_{i=1}^n\sum\limits_{j=1}^m[gcd(i,j)==d]\frac{i*j}ozvdkddzhkzd$

$\sum\limits_{d=1}^n d\sum\limits_{i=1}^{\left\lfloor\frac{n}ozvdkddzhkzd\right\rfloor}\sum\limits_{j=1}^{\left\lfloor\frac{m}ozvdkddzhkzd\right\rfloor}[gcd(i,j)==1]i*j$

先算后半段,開始xjb使用基本結論(μx1=ε)

$=...\sum\limits_{i=1}^{\left\lfloor\frac{n}ozvdkddzhkzd\right\rfloor}\sum\limits_{j=1}^{\left\lfloor\frac{m}ozvdkddzhkzd\right\rfloor}\sum_{t|gcd(i,j)}μ(t)i*j$

向前提$μ$

$=...\sum\limits_{t=1}^{n}μ(t)\sum\limits_{t|i}^{\left\lfloor\frac{n}ozvdkddzhkzd\right\rfloor}\sum\limits_{t|j}^{\left\lfloor\frac{m}ozvdkddzhkzd\right\rfloor}i*j$

為了丟掉整除的限制,我們枚舉除過$t$的結果,在前面用$t^2$補上

$=...\sum\limits_{t=1}^nμ(t)t^2\sum\limits_{i=1}^{\left\lfloor\frac{n}{dt}\right\rfloor}\sum\limits_{j=1}^{\left\lfloor\frac{m}{dt}\right\rfloor}i*j$

對于$\left\lfloor\frac{n}{dt}\right\rfloor$這后面的東西可以$O(1)$算,所以可以數論分塊+等差數列求和解決,再把后半段整個拿出來數論分塊,就可以做到$O(n)$了

1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int N=1e7+70,mod=20101009; 6 int n,m,cnt,pri[N],npr[N],mul[N],sum[N]; 7 void Add(int &x,int y){x+=y; if(x>=mod) x-=mod;} 8 void Pre(int a,int b) 9 { 10 int lim=min(a,b); 11 npr[1]=true,mul[1]=1; 12 for(int i=2;i<=lim;i++) 13 { 14 if(!npr[i]) pri[++cnt]=i,mul[i]=-1; 15 for(int j=1,t;j<=cnt&&(t=i*pri[j])<=lim;j++) 16 { 17 npr[t]=true; 18 if(i%pri[j]==0) break; 19 else mul[t]=-mul[i]; 20 } 21 } 22 for(int i=1;i<=lim;i++) 23 sum[i]=(sum[i-1]+1ll*i*i%mod*(mul[i]+mod)%mod)%mod; 24 } 25 int Calc(int a,int b) 26 { 27 return 1ll*a*(a+1)/2%mod*(1ll*b*(b+1)/2%mod)%mod; 28 } 29 int G(int a,int b) 30 { 31 int ret=0,lim=min(a,b); 32 for(int i=1,j;i<=lim;i=j+1) 33 { 34 j=min(a/(a/i),b/(b/i)); 35 Add(ret,1ll*Calc(a/i,b/j)*(sum[j]-sum[i-1]+mod)%mod); 36 } 37 return ret; 38 } 39 int F(int a,int b) 40 { 41 int ret=0,lim=min(a,b); 42 for(int i=1,j;i<=lim;i=j+1) 43 { 44 j=min(a/(a/i),b/(b/i)); 45 Add(ret,1ll*(i+j)*(j-i+1)/2%mod*G(a/i,b/i)%mod); 46 } 47 return ret; 48 } 49 int main() 50 { 51 scanf("%d%d",&n,&m),Pre(n,m); 52 printf("%d",F(n,m)); 53 return 0; 54 } View Code

?

BZOJ 4407 于神之怒加強版

求$\sum\limits_{i=1}^n\sum\limits_{j=1}^m gcd(i,j)^k(mod$ $1e9+7)$

枚舉gcd

$\sum\limits_{d=1}^nd^k\sum\limits_{i=1}^n\sum\limits_{j=1}^m[gcd(i,j)==d]$

$\sum\limits_{d=1}^nd^k\sum\limits_{i=1}^{\left\lfloor\frac{n}ozvdkddzhkzd\right\rfloor}μ(i)\left\lfloor\frac{n}{id}\right\rfloor\left\lfloor\frac{m}{id}\right\rfloor$

因為多次詢問,現在的復雜度還不夠

枚舉id并前提

$\sum\limits_{k=1}^{n}\left\lfloor\frac{n}{k}\right\rfloor\left\lfloor\frac{n}{k}\right\rfloor\sum_{d|k}μ(\frac{k}ozvdkddzhkzd)d^k$

后面這個東西可以用 線性篩那一套.jpg

1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int N=5e6+50,mod=1e9+7; 6 int n,k,t1,t2,nm,cnt,ans; 7 int pri[N],npr[N],pwe[N],sum[N]; 8 9 void Add(int &x,int y){x+=y; if(x>=mod) x-=mod;} 10 int Qpow(int x,int k) 11 { 12 if(k==1) return x; 13 int tmp=Qpow(x,k/2); 14 return k%2?1ll*tmp*tmp%mod*x%mod:1ll*tmp*tmp%mod; 15 } 16 17 void Pre() 18 { 19 int lim=5e6; 20 npr[1]=true,sum[1]=1; 21 for(int i=2;i<=lim;i++) 22 { 23 if(!npr[i]) 24 { 25 pri[++cnt]=i,pwe[cnt]=Qpow(i,k); 26 sum[i]=(pwe[cnt]-1+mod)%mod; 27 } 28 for(int j=1,t;j<=cnt&&(t=i*pri[j])<=lim;j++) 29 { 30 npr[t]=true; 31 if(i%pri[j]==0) {sum[t]=1ll*sum[i]*pwe[j]%mod; break;} 32 else sum[t]=1ll*sum[i]*sum[pri[j]]%mod; 33 } 34 } 35 for(int i=2;i<=lim;i++) 36 Add(sum[i],sum[i-1]); 37 } 38 int main() 39 { 40 scanf("%d%d",&n,&k),Pre(); 41 for(int i=1;i<=n;i++) 42 { 43 scanf("%d%d",&t1,&t2); 44 ans=0,nm=min(t1,t2); 45 for(int l=1,r;l<=nm;l=r+1) 46 { 47 r=min(t1/(t1/l),t2/(t2/l)); 48 Add(ans,1ll*(t1/l)*(t2/l)%mod*(sum[r]-sum[l-1]+mod)%mod); 49 } 50 printf("%d\n",ans); 51 } 52 return 0; 53 } View Code

?

洛谷 4917 天守閣的地板

求$\prod\limits_{i=1}^n\prod\limits_{j=1}^n\frac{lcm(i,j)}{gcd(i,j)}$,多次詢問

事車萬題,wsl

還是那句話,所有的lcm歸根結底都是gcd

$\prod\limits_{i=1}^n\prod\limits_{j=1}^n\frac{lcm(i,j)}{gcd(i,j)}$

$=\prod\limits_{i=1}^n\prod\limits_{j=1}^n\frac{i*j}{gcd(i,j)^2}$

仍然枚舉gcd?這次不啦,分子分母分開算

分子:

$=\prod\limits_{i=1}^n\prod\limits_{j=1}^ni*j$

$=n!^{2n}$

大 成 功

分母:

$=\prod\limits_{i=1}^n\prod\limits_{j=1}^ngcd(i,j)^2$

這里又來枚舉gcd了,類似SDOI2017那樣,我們枚舉gcd用指數進行貢獻,這里我們只寫指數了

$=...2*(\sum\limits_{i=1}^n\sum\limits_{j=1}^n[gcd(i,j)==d])$

注意這里還是指數呢,我們前面還有一個數論分塊的$O(\sqrt n)$等著呢,所以要做到$O(1)$

$=...2*(\sum\limits_{i=1}^{\left\lfloor\frac{n}ozvdkddzhkzd\right\rfloor}\sum\limits_{j=1}^{\left\lfloor\frac{n}ozvdkddzhkzd\right\rfloor}[gcd(i,j)==1])$

$=...2*((\sum\limits_{i=1}^{\left\lfloor\frac{n}ozvdkddzhkzd\right\rfloor}φ(i))*2-1)$

對指數數論分塊,預處理階乘和逆元,$O(T\sqrt n \log n)$完事了

1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #define o 1ll 5 using namespace std; 6 const int N=1e6+60,mod=19260817; 7 int n,rd,cnt,pri[N],npr[N],phi[N],fac[N],inv[N]; 8 int Qpow(int x,int k) 9 { 10 if(k==1) return x; 11 int tmp=Qpow(x,k/2); 12 return k%2?1ll*tmp*tmp%mod*x%mod:1ll*tmp*tmp%mod; 13 } 14 void Pre() 15 { 16 int lim=1e6; 17 fac[0]=inv[0]=1; 18 for(int i=1;i<=lim;i++) fac[i]=1ll*fac[i-1]*i%mod; 19 inv[lim]=Qpow(fac[lim],mod-2); 20 for(int i=lim-1;i;i--) inv[i]=1ll*inv[i+1]*(i+1)%mod; 21 npr[1]=true,phi[1]=1; 22 for(int i=2;i<=lim;i++) 23 { 24 if(!npr[i]) pri[++cnt]=i,phi[i]=i-1; 25 for(int j=1,t;j<=cnt&&(t=i*pri[j])<=lim;j++) 26 { 27 npr[t]=true,phi[t]=phi[i]*pri[j]; 28 if(i%pri[j]==0) break; 29 else phi[t]-=phi[i]; 30 } 31 } 32 for(int i=1;i<=lim;i++) phi[i]=(phi[i]+phi[i-1])%(mod-1); 33 } 34 int main() 35 { 36 scanf("%d",&n),Pre(); 37 for(int i=1;i<=n;i++) 38 { 39 scanf("%d",&rd); 40 int fz=Qpow(fac[rd],2*rd),fm=1; 41 for(int l=1,r,m;l<=rd;l=r+1) 42 { 43 r=rd/(rd/l),m=o*fac[r]*inv[l-1]%mod; 44 fm=o*fm*Qpow(m,phi[rd/l]*2-1)%mod; 45 } 46 printf("%lld\n",o*fz*Qpow(o*fm*fm%mod,mod-2)%mod); 47 } 48 return 0; 49 } View Code

?

NOI 2016 循環之美 84pts部分分代碼

前排提示:這篇題解寫的比較歡(沙)樂(茶),原因你下面就知道了

正解太神仙了,所以......

咕!

但是84pts的暴力真的很良心啊=。=(想起了同是NOI2016的優秀的拆分......)

運用我們小學學到的有趣小知識(√)/大力推一推(×)/打表+猜想(?)

我們發現一個數純循環當且僅當分子分母互質且分母與進制數互質

一定要證明?

咕!

所以我們又來推式子了

(在寫下這句話的時候,沙茶博主已經看+推了一下午+一晚上的莫反式子了,所以......)

$\sum\limits_{i=1}^n\sum\limits_{j=1}^m[gcd(i,j)==1\&\&gcd(j,k)==1]$

又來枚舉gcd了......嗎?

枚舉個毛線鴨,帶著&&怎么枚舉鴨

再咕就只剩24pts了,還是算了

下設n<=m

那看來我們只能把兩邊分開了

$=\sum\limits_{j=1}^m[gcd(j,k)==1]\sum\limits_{i=1}^n[gcd(i,j)==1]$

后面使用基本結論

$=\sum\limits_{j=1}^m[gcd(j,k)==1]\sum\limits_{i=1}^n\sum_{d|n}μ(d)$

算$d$的貢獻

$=\sum\limits_{j=1}^m[gcd(j,k)==1]\sum_{d|j}μ(d)\left\lfloor\frac{n}ozvdkddzhkzd\right\rfloor$

前提μ,然后前面的那個就降到n了

$\sum\limits_{d=1}^nμ(d)\left\lfloor\frac{n}ozvdkddzhkzd\right\rfloor\sum\limits_{j=1}^m[d|j\&\&gcd(j,k)==1]$

$\sum\limits_{d=1}^nμ(d)\left\lfloor\frac{n}ozvdkddzhkzd\right\rfloor\sum\limits_{j=1}^{\left\lfloor\frac{m}ozvdkddzhkzd\right\rfloor}[gcd(j*d,k)==1]$

$\sum\limits_{d=1}^n[gcd(d,k)==1]μ(d)\left\lfloor\frac{n}ozvdkddzhkzd\right\rfloor\sum\limits_{j=1}^{\left\lfloor\frac{m}ozvdkddzhkzd\right\rfloor}[gcd(j,k)==1]$

然后我們發現前面這個東西套的太多了,只能$O(n)$(其實是$O(n\log n)$,因為還有gcd)算,所以我們必須$O(1)$得到后面的東西,然而m太大了無法承受

?

不咕

如果你稍微想一想或者把表打出來看一看,顯然后面這個玩意是以k為循環節的

然后就愉快的拿到了84pts

1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int N=2e7+70; 6 int n,m,k,lim,cnt; long long ans; 7 int pri[N],npr[N],mul[N],fuc[N]; 8 int gcd(int a,int b){return b?gcd(b,a%b):a;} 9 void Pre() 10 { 11 register int i,j,t; 12 npr[1]=true,mul[1]=1,lim=min(n,m); 13 for(i=2;i<=lim;i++) 14 { 15 if(!npr[i]) pri[++cnt]=i,mul[i]=-1; 16 for(j=1;j<=cnt&&(t=i*pri[j])<=lim;j++) 17 { 18 npr[t]=true; 19 if(i%pri[j]==0) break; 20 else mul[t]=-mul[i]; 21 } 22 } 23 for(i=1;i<=k;i++) fuc[i]=fuc[i-1]+(gcd(i,k)==1); 24 } 25 int main() 26 { 27 register int i; 28 scanf("%d%d%d",&n,&m,&k),Pre(); 29 for(i=1;i<=lim;i++) 30 if(gcd(i,k)==1) 31 ans+=1ll*mul[i]*(n/i)*((m/i/k)*fuc[k]+fuc[m/i%k]); 32 printf("%lld",ans); 33 return 0; 34 } View Code

?

關于杜教篩相關的莫反,他咕了


二項式反演

至少 反演出 恰好

設前者為f(n),后者為g(n),則有$f(n)=\sum\limits_{i=0}^nC_n^ig(i)<->g(n)=\sum\limits_{i=0}^n(-1)^iC_n^if(i)$

至多 反演出 恰好

設前者為f(n),后者為g(n),則有$f(n)=\sum\limits_{i=0}^nC_n^ig(i)<->g(n)=\sum\limits_{i=0}^n (-1)^{n-i}C_n^if(i)$

轉載于:https://www.cnblogs.com/ydnhaha/p/10544432.html

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的省选前的反演抢救计划的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。