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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

牛客练习赛84F-牛客推荐系统开发之下班【莫比乌斯反演,杜教筛】

發布時間:2023/12/3 windows 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 牛客练习赛84F-牛客推荐系统开发之下班【莫比乌斯反演,杜教筛】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

正題

題目鏈接:https://ac.nowcoder.com/acm/contest/11174/F


題目大意

給出n,kn,kn,k
∑i1=1n∑i2=1n...∑ik=1ngcd(fi1,fi2,...,fik)\sum_{i_1=1}^n\sum_{i_2=1}^n...\sum_{i_k=1}^ngcd(f_{i_1},f_{i_2},...,f_{i_{k}})i1?=1n?i2?=1n?...ik?=1n?gcd(fi1??,fi2??,...,fik??)
109+910^9+9109+9取模

其中fif_ifi?表示斐波那契數列的第iii

1≤n,k≤1081\leq n,k\leq 10^81n,k108


解題思路

看上去就很莫比烏斯反演,首先把fff提出來然后直接上莫反就是
∑i=1nfi∑j=1?ni?μ(j)?nij?k\sum_{i=1}^nf_{i}\sum_{j=1}^{\lfloor\frac{n}{i}\rfloor}\mu(j)\lfloor\frac{n}{ij}\rfloor^ki=1n?fi?j=1?in???μ(j)?ijn??k
這個式子其實就可以直接做了,外面fif_ifi?是一個整除分塊,然后里面的式子也是一個整除分塊。需要的算法是一個矩陣乘法求斐波那契的前綴和(當然因為5\sqrt 55?109+910^9+9109+9下有二次剩余可以直接用特制方程求)還有一個杜教篩求μ\muμ的前綴和。

因為整除分塊套整除分塊的復雜度是O(n34)O(n^{\frac{3}{4}})O(n43?),然后最里面套個杜教篩復雜度不會大很多所以能過。

然后有一個大佬的做法是把上面那個式子化一下
∑i=1n?ni?k∑d∣ifdμ(id)\sum_{i=1}^n\lfloor\frac{n}{i}\rfloor^k\sum_{d|i}f_ozvdkddzhkzd\mu(\frac id)i=1n??in??kdi?fd?μ(di?)
(相當于外面枚舉i×ji\times ji×j然后枚舉它的約數)

然后因為μ?I=?\mu*I=\epsilonμ?I=?,所以f?μ?I=f??=ff*\mu*I=f*\epsilon=ff?μ?I=f??=f。所以如果在能快速求fff的前綴和的情況下求f?μf*\muf?μ的前綴和可以用杜教篩來做。

然后上面那個式子整除分塊一下就好了

代碼的寫法是第一種


code

#include<cstdio> #include<cstring> #include<algorithm> #include<map> #define ll long long using namespace std; const ll N=5e6+10,S=3,P=1e9+9; struct Matrix{ll a[S][S]; }c,f,am; ll n,k,ans,cnt,mu[N],pri[N/10]; bool v[N];map<ll ,ll >mp; Matrix operator*(Matrix &a,Matrix &b){memset(c.a,0,sizeof(c.a));for(ll i=0;i<S;i++)for(ll j=0;j<S;j++)for(ll k=0;k<S;k++)(c.a[i][j]+=a.a[i][k]*b.a[k][j]%P)%=P;return c; } ll power(ll x,ll b){ll ans=1;while(b){if(b&1)ans=ans*x%P;x=x*x%P;b>>=1;}return ans; } ll Fbi(ll b){memset(f.a,0,sizeof(f.a));am.a[0][0]=am.a[0][2]=0;am.a[0][1]=1;f.a[2][2]=1;f.a[0][1]=1;f.a[1][1]=1;f.a[1][0]=1;f.a[1][2]=1;while(b){if(b&1)am=am*f;f=f*f;b>>=1; }return am.a[0][2]; } void Prime(){mu[1]=1;for(ll i=2;i<N;i++){if(!v[i])pri[++cnt]=i,mu[i]=-1;for(ll j=1;j<=cnt&&i*pri[j]<N;j++){v[i*pri[j]]=1;if(i%pri[j]==0)break;mu[i*pri[j]]=-mu[i];}}for(ll i=1;i<N;i++)mu[i]+=mu[i-1];return; } ll GetMu(ll n){if(n<N)return mu[n];if(mp[n])return mp[n];ll ans=1;for(ll l=2,r;l<=n;l=r+1)r=n/(n/l),ans=ans-(r-l+1)*GetMu(n/l);return mp[n]=ans; } ll g(ll n){ll ans=0;for(ll l=1,r;l<=n;l=r+1){r=n/(n/l);ll tmp=GetMu(r)-GetMu(l-1);ans=(ans+tmp*power(n/l,k)%P)%P;}return ans; } signed main() {Prime();scanf("%lld%lld",&n,&k);for(ll l=1,r;l<=n;l=r+1){r=n/(n/l);ll tmp=Fbi(r)-Fbi(l-1);ans=(ans+tmp*g(n/l)%P)%P;}printf("%lld\n",(ans+P)%P);return 0; }

總結

以上是生活随笔為你收集整理的牛客练习赛84F-牛客推荐系统开发之下班【莫比乌斯反演,杜教筛】的全部內容,希望文章能夠幫你解決所遇到的問題。

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