51nod1355 斐波那契的最小公倍数

给 n 个斐波那契数,求他们的最小公倍数,膜 $10^9+7$

$n \leq 50000$,给出的斐波那契数都在不超过 $10^6$ 项出现

sol:

#include <bits/stdc++.h>
using namespace std;
const int N=1e6+50, mod=1e9+7;
inline int add(int x,int y) {return (x+y>=mod) ? (x+y-mod) : (x+y);}
inline int dec(int x,int y) {return (x-y<0) ? (x-y+mod) : (x-y);}
inline int mul(int x,int y) {return (long long)x*y%mod;}
inline int power(int a,int b,int rs=1) {for(;b;b>>=1,a=mul(a,a)) if(b&1) rs=mul(rs,a); return rs;}
int n,a[N],mx,fib[N],g[N],ok[N];
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i], mx=max(mx,a[i]), ok[a[i]]=1;
    fib[1]=1;
    for(int i=2;i<=mx;i++) fib[i]=add(fib[i-1],fib[i-2]);
    for(int i=1;i<=mx;i++) g[i]=fib[i];
    int ans=1;
    for(int i=1;i<=mx;i++)
    {
        const int inv=power(g[i],mod-2);
        for(int j=2;j*i<=mx;j++) g[i*j]=mul(g[i*j],inv);
    }
    for(int i=1;i<=mx;i++)
        for(int j=1;j*i<=mx;j++) 
            if(ok[i*j]) {ans=mul(ans,g[i]); break;}
    cout<<ans<<endl;
}
View Code

 

posted @ 2018-12-26 15:49  探险家Mr.H  阅读(271)  评论(0编辑  收藏  举报