进入斐波那契领域的第一题…
不要脸地截图了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;
}