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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

BZOJ4833 [Lydsy1704月赛]最小公倍佩尔数

發布時間:2023/12/15 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BZOJ4833 [Lydsy1704月赛]最小公倍佩尔数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題意

已知\(e_n+\sqrt2f_n=(1+\sqrt2)^n\)\(e_n-\sqrt2f_n=(1-\sqrt2)^n\)\(g_n=lcm_{i=1}^nf_i\),求\(\sum_{i=1}^{n}g_i\times i\)


首先可以得到\(e_{n-1}+\sqrt2f_{n-1}=(1+\sqrt2)^{n-1}\)

那么\(e_n+\sqrt2f_n=(1+\sqrt2)(e_{n-1}+\sqrt2f_{n-1}) =(e_{n-1}+2f_{n-1})+\sqrt2(e_{n-1}+f_{n-1})\)

\(e_n=e_{n-1}+2f_{n-1}\)\(f_n=e_{n-1}+f_{n-1}\)

繼續往下推:\(f_n=e_{n-2}+2f_{n-2}+f_{n-1}=2f_{n-1}+f_{n-2}\)

\(0,1\)代入題面的兩個式子可以解出\(f_0=0,f_1=1\)

所以我們可以\(O(n)\)求出所有\(f\)的值。

這里有一個性質:

\[ f_n=2f_{n-1}+f_{n-2}\\ =5f_{n-2}+2f_{n-3}\\ =12f_{n-3}+5f_{n-4}\\ ...\\ =f_mf_{n-m+1}+f_{m-1}f_{n-m} \]

接下來把\(g\)反演一波,設\(S={\{}1,2,...,n{\}}\)

\[ g_n=lcm_{i=1}^nf_i= \prod_{T\subseteq S,T\neq \emptyset}gcd(f(T))^{(-1)^{|T|+1}} \]

根據剛才\(f\)的性質可以得到:

\[ gcd(f_n,f_m)=gcd(f_mf_{n-m+1}+f_{m-1}f_{n-m},f_m)=gcd(f_{m-1}f_{n-m},f_m)\\ \because gcd(f_{m-1},f_m)=1\\ \therefore gcd(f_{m-1}f_{n-m},f_m)=gcd(f_{n-m},f_m)\\ gcd(f_n,f_m)=gcd(f_{n-m},f_m) \]

那么往下寫可以發現:

\[ gcd(f_n,f_m)=gcd(f_{n-m},f_m)=gcd(f_{n-2m},f_m)=...=gcd(f_{n\mod m},f_m) \]

繼續算的話我們會用\(n\mod m\)\(m\)較大的一個減較小的一個,重復上面的過程......

可以發現最后就是\(gcd(f_{gcd(n,m)},f_0)=f_{gcd(n,m)}\)

所以\(gcd(f_n,f_m)=f_{gcd(n,m)}\)

回到反演\(g\)的式子:

\[ g_n=\prod_{T\subseteq S,T\neq \emptyset}gcd(f(T))^{(-1)^{|T|+1}} =\prod_{T\subseteq S,T\neq \emptyset}f_{gcd(T)}^{(-1)^{|T|+1}}\\ =\prod_{d=1}^n\prod_{T\subseteq S,T\neq \emptyset} [gcd(T)=d]f_d^{(-1)^{|T|+1}}\\ =\prod_{d=1}^nf_d^{\sum_{T\subseteq S,T\neq \emptyset} [gcd(T)=d](-1)^{|T|+1}} \]

把指數部分拎出來,設\(h_d=\sum_{T\subseteq S,T\neq \emptyset} [gcd(T)=d](-1)^{|T|+1}\),再設\(t_k=\sum_{k|d}^{n}h_d\),那么

\[ t_k=\sum_{T\subseteq S,T\neq \emptyset} [k|gcd(T)](-1)^{|T|+1} \]

考慮\(S\)中每個元素的貢獻,設\(m=\frac{n}{k}\),那么

\[ t_k=\sum_{i=1}^{m}{m\choose i}(-1)^{i+1}\\ =-\sum_{i=1}^{m}{m\choose i}(-1)^i\\ =-\sum_{i=0}^{m}{m\choose i}(-1)^i+1=1 \]

再對\(h\)反演一下:\(h_k=\sum_{k|d}^{n}\mu_{\fracozvdkddzhkzd{k}}t_k= \sum_{k|d}^{n}\mu_{\fracozvdkddzhkzd{k}}\)

代回\(g_n\)的式子就是:

\[ g_n=\prod_{i=1}^{n}f_i^{h_k}= \prod_{i=1}^{n}f_i^{\sum_{k|d}^{n}\mu_{\fracozvdkddzhkzd{k}}}= \prod_{i=1}^{n}(\prod_{d|i}^{n}f_d^{\mu_{\frac{i}ozvdkddzhkzd}}) \]

所以只需要算出\(\prod_{d|i}^{n}f_d^{\mu_{\frac{i}ozvdkddzhkzd}}\)即可。這個也很好算,對于每個\(d\),把每個\(d\)的倍數\(kd\)對應的\(g_{kd}\)乘上\(f_d\)即可。時間復雜度為\(O(\sum_{i=1}^{n}\frac{n}{i})=O(nlogn)\)

#include<bits/stdc++.h> #define rg register #define il inline #define cn const #define gc getchar() #define fp(i,a,b) for(rg int i=(a),ed=(b);i<=ed;++i) using namespace std; typedef cn int cint; il int rd(){rg int x(0),f(1); rg char c(gc);while(c<'0'||'9'<c){ if(c=='-') f=-1; c=gc; }while('0'<=c&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=gc;return x*f; } cint maxn=1000010;int T,n,mod; int isnp[maxn],mu[maxn],pri[maxn],cnt; int f[maxn],inv[maxn],g[maxn],ans;il void calc_mu(cint &n){mu[1]=1;fp(i,2,n){if(!isnp[i])mu[i]=-1,pri[++cnt]=i;for(rg int j=1;j<=cnt&&pri[j]*i<=n;++j){isnp[pri[j]*i]=1;if(i%pri[j]==0)break;mu[i*pri[j]]=-mu[i];}} }il int fpow(int a,int b,int ans=1){for(;b;b>>=1,a=1ll*a*a%mod)if(b&1)ans=1ll*ans*a%mod;return ans; }int main(){calc_mu(1000000);T=rd();while(T--){n=rd(),mod=rd();f[1]=1; fp(i,2,n)f[i]=(2ll*f[i-1]%mod+f[i-2])%mod;fp(i,1,n)inv[i]=fpow(f[i],mod-2);fp(i,1,n)g[i]=1;fp(i,1,n){for(rg int j=i;j<=n;j+=i){if(mu[j/i]>0)g[j]=1ll*g[j]*f[i]%mod;if(mu[j/i]<0)g[j]=1ll*g[j]*inv[i]%mod;}}fp(i,2,n)g[i]=1ll*g[i]*g[i-1]%mod;ans=0; fp(i,1,n)ans=(ans+1ll*g[i]*i%mod)%mod;printf("%d\n",ans);}return 0; }

總結

以上是生活随笔為你收集整理的BZOJ4833 [Lydsy1704月赛]最小公倍佩尔数的全部內容,希望文章能夠幫你解決所遇到的問題。

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