原题
上次没写题解这次补一下得了
首先由
首先证明
然后
用归纳法可以证明
然后就可以证明
然后就完了
考虑
对指数取
用
容斥得
考虑设一个
满足
那么有
或
那么原式
考虑指数若存在
个数有
这个因子
无贡献
否则
于是每次倍数即可
复杂度
#include<bits/stdc++.h>
using namespace std;
const int RLEN=1<<20|1;
inline char gc(){
static char ibuf[RLEN],*ib,*ob;
(ob==ib)&&(ob=(ib=ibuf)+fread(ibuf,1,RLEN,stdin));
return (ob==ib)?EOF:*ib++;
}
inline int read(){
char ch=gc();
int res=0,f=1;
while(!isdigit(ch))f^=ch=='-',ch=gc();
while(isdigit(ch))res=(res+(res<<2)<<1)+(ch^48),ch=gc();
return f?res:-res;
}
#define ll long long
#define re register
#define pii pair<int,int>
#define fi first
#define se second
#define pb push_back
#define cs const
#define bg begin
#define poly vector<int>
cs int mod=1e9+7;
inline int add(int a,int b){return (a+=b)>=mod?a-mod:a;}
inline int dec(int a,int b){return (a-=b)<0?a+mod:a;}
inline int mul(int a,int b){return 1ll*a*b%mod;}
inline void Add(int &a,int b){(a+=b)>=mod?a-=mod:0;}
inline void Dec(int &a,int b){(a-=b)<0?a+=mod:0;}
inline void Mul(int &a,int b){a=1ll*a*b%mod;}
inline int ksm(int a,int b,int res=1){for(;b;b>>=1,Mul(a,a))(b&1)&&(Mul(res,a),1);return res;}
inline int Inv(int x){return ksm(x,mod-2);}
inline void chemx(int &a,int b){a<b?a=b:0;}
inline void chemn(int &a,int b){a>b?a=b:0;}
cs int N=1000005;
int n,a[N],mx;
bitset<N> vis;
int pr[N],tot,mu[N];
int f[N],g[N];
inline void init(cs int len=N-5){
mu[1]=1;
for(int i=2;i<=len;i++){
if(!vis[i])pr[++tot]=i,mu[i]=-1;
for(int j=1;j<=tot&&pr[j]*i<=len;j++){
vis[i*pr[j]]=1;
if(i%pr[j]==0)break;
mu[i*pr[j]]=-mu[i];
}
}vis.reset();
}
int main(){
#ifdef Stargazer
freopen("lx.in","r",stdin);
#endif
init(),n=read();
for(int i=1;i<=n;i++)a[i]=read(),chemx(mx,a[i]),vis[a[i]]=1;
f[1]=f[2]=g[1]=g[2]=1;
for(int i=3;i<=mx;i++)f[i]=add(f[i-1],f[i-2]),g[i]=1;
for(int i=1;i<=mx;i++)
for(int j=1,iv=Inv(f[i]);j*i<=mx;j++)
if(mu[j])Mul(g[i*j],mu[j]==1?f[i]:iv);
int res=1;
for(int i=1;i<=mx;i++)
for(int j=i;j<=mx;j+=i)
if(vis[j]){Mul(res,g[i]);break;}
cout<<res;
}