斐波那契公倍數

題目大意

給定n個數\(a_1\)~\(a_n\),定義\(f_i\)爲斐波那契數列,求出\(lcm(f_{a_1},...,f_{a_n})\)\(n\leq5\times 10^4\)\(a_i\leq10^6\)


根據斐波那契的性質,有\(gcd(f_n,f_m)=f_{gcd(n,m)}\)

又根據常識\(lcm(n,m)=\frac{nm}{gcd(n,m)}\)\(lcm(a,b,c)=\frac{abc\times gcd(a,b,c)}{gcd(a,b)\times gcd(b,c)\times gcd(a,c)}\),所以答案就是:

\[\prod_k f_k^{\sum_S(-1)^{|S|+1}[gcd(S)=k]} \]

只看指數部分,\(\sum_S(-1)^{|S|+1}[gcd(S)=k]=\sum_S(-1)^{|S|+1}[gcd(\frac{S}{k})=1]\)

\[=\sum_{S}(-1)^{|S|+1}\sum_{d|gcd(\frac{S}{k})}\mu(d) \\=\sum_{d}\mu(d)\sum_{kd|S}(-1)^{|S|+1} \]

就相當於只選\(kd\)的倍數貢獻是\((-1)^{選的個數+1}\),寫出來就是\(\sum_{i=1}^{m}{m\choose i}(-1)^{i+1}\),從一開始是因爲不能不選,\(m\)是一共有多少個\(kd\)的倍數。就等於\(-\sum_{i=0}^m{m\choose i}(-1)^i+1=1\times [m\neq 0]\)。所以對於一個\(k\),他的貢獻就是\(\sum_{d=1}^{max\{a_i\}/k}\mu(d)\times [\exists x,kd|x]\)。複雜度\(n\ln n\)


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;
}
il int calc(cint &k){
    rg int ans=0;
    fp(i,1,mx/k)if(vis[i*k])ans=(ans+mu[i])%(mod-1);
    return ans;
}
int main(){
    n=rd();
    fp(i,1,n)a[i]=rd(),mx=max(mx,a[i]);
    mu[1]=1;
    fp(i,2,mx){
        if(!isnp[i])pri[++cnt]=i,mu[i]=mod-2;
        for(rg int j=1;j<=cnt&&pri[j]*i<=mx;++j){
            isnp[i*pri[j]]=1;
            if(i%pri[j]==0)break;
            mu[i*pri[j]]=mod-1-mu[i];
        }
    }
    fp(i,1,n)for(rg int j=1;j*j<=a[i];++j)if(a[i]%j==0)vis[j]=vis[a[i]/j]=1;
    f[1]=1; fp(i,2,mx)f[i]=(f[i-1]+f[i-2])%mod;
    fp(i,1,mx)ans=1ll*ans*fpow(f[i],calc(i))%mod;
    printf("%d\n",ans);
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章