P3704-[SDOI2017]数字表格【莫比乌斯反演】
正題
題目鏈接:https://www.luogu.com.cn/problem/P3704
題目大意
TTT組詢(xún)問(wèn),給出n,mn,mn,m求∏i=1n∏j=1mFbigcd(i,j)\prod_{i=1}^n\prod_{j=1}^mFbi_{gcd(i,j)}i=1∏n?j=1∏m?Fbigcd(i,j)?
其中FbixFbi_xFbix?表示第xxx項(xiàng)斐波那契數(shù)列。
解題思路
答案就是∏x=1nFbix∑i=1n∑j=1m[gcd(i,j)==x]\prod_{x=1}^nFbi_x^{\sum_{i=1}^n\sum_{j=1}^m[gcd(i,j)==x]}x=1∏n?Fbix∑i=1n?∑j=1m?[gcd(i,j)==x]?
然后上反演就是∏x=1nFbix∑x∣d?nd??md?μ(dx)\prod_{x=1}^nFbi_x^{\sum_{x|d}\lfloor\frac{n}ze8trgl8bvbq\rfloor\lfloor\frac{m}ze8trgl8bvbq\rfloor\mu(\fracze8trgl8bvbq{x})}x=1∏n?Fbix∑x∣d??dn???dm??μ(xd?)?
同樣是提出來(lái)∏d=1n(∏x∣dnFbixμ(dx))?nd??md?\prod_{d=1}^n(\prod_{x|d}^nFbi_x^{\mu(\fracze8trgl8bvbq{x})})^{\lfloor\frac{n}ze8trgl8bvbq\rfloor\lfloor\frac{m}ze8trgl8bvbq\rfloor}d=1∏n?(x∣d∏n?Fbixμ(xd?)?)?dn???dm??
然后預(yù)處理∏x∣dnFbixμ(dx)\prod_{x|d}^nFbi_x^{\mu(\fracze8trgl8bvbq{x})}∏x∣dn?Fbixμ(xd?)?的前綴積再整除分塊即可
時(shí)間復(fù)雜度O(Tn+m)O(T\sqrt{n+m})O(Tn+m?)
codecodecode
#include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; const ll N=1e6+10,P=1e9+7; ll T,n,m,cnt,ans;bool v[N]; ll mu[N],f[N],g[N],pri[N],inv[N]; 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; } void Prime(){mu[1]=f[1]=inv[1]=g[0]=g[1]=1;for(ll i=2;i<N;i++){if(!v[i])pri[++cnt]=i,mu[i]=-1;g[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]*mu[pri[j]];}}for(ll i=2;i<N;i++)f[i]=(f[i-1]+f[i-2])%P,inv[i]=power(f[i],P-2);for(ll i=1;i<N;i++){if(!mu[i])continue;for(ll j=i;j<N;j+=i){if(mu[i]==1)(g[j]*=f[j/i])%=P;else (g[j]*=inv[j/i])%=P;}}inv[1]=inv[0]=1;for(ll i=2;i<N;i++)g[i]=g[i]*g[i-1]%P,inv[i]=power(g[i],P-2);return; } int main() {Prime();scanf("%lld",&T);while(T--){scanf("%lld%lld",&n,&m);ans=1;if(n>m)swap(n,m);for(ll l=1,r;l<=n;l=r+1){r=min(n/(n/l),m/(m/l));ll mul=g[r]*inv[l-1]%P;ans=ans*power(mul,(n/l)*(m/l)%(P-1))%P;}printf("%lld\n",ans);} }總結(jié)
以上是生活随笔為你收集整理的P3704-[SDOI2017]数字表格【莫比乌斯反演】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 京东店铺装修,如果将商品分类采集并下载到
- 下一篇: 台式电脑怎么选台式电脑怎么买