[数论 斐波那契] 51nod1355. 斐波那契的最小公倍数

来源:互联网 发布:强矩阵 编辑:程序博客网 时间:2024/05/23 23:06

进入斐波那契领域的第一题…
这里写图片描述
不要脸地截图了Manchery的博客……原文在这里

#include <cstdio>#include <iostream>#include <algorithm>using namespace std;const int N=1000010,P=1e9+7;int n,x,ans=1,f[N],vis[N],g[N];int gcd(int x,int y){    return y?gcd(y,x%y):x;}inline int Pow(int x,int y){    int ret=1;    for(;y;y>>=1,x=1LL*x*x%P) if(y&1) ret=1LL*ret*x%P;    return ret;}int main(){    scanf("%d",&n);    f[1]=f[2]=1; g[1]=g[2]=1;    for(int i=3;i<=N-10;i++)        g[i]=f[i]=(f[i-1]+f[i-2])%P;    for(int i=1;i<=N-10;i++){        int INV=Pow(g[i],P-2);        for(int j=i+i;j<=N-10;j+=i)            g[j]=1LL*g[j]*INV%P;    }    for(int i=1;i<=n;i++)        scanf("%d",&x),vis[x]=1;    for(int i=1;i<=N-10;i++){        int t=0;        for(int j=i;j<=N-10 && !t;j+=i)            if(vis[j]) t=1;        if(t) ans=1LL*ans*g[i]%P;    }       printf("%d\n",ans);    return 0;}
原创粉丝点击