把 (operatorname{lcm}) 转化成 (gcd),就是对每个因子应用一下 min-max 容斥:
[operatorname{lcm}(S)=prod_{Tsubseteq S,S
eq varnothing}gcd(T)^{(-1)^{|T|-1}}
]
然后由于斐波那契数列有 (gcd(f_a,f_b)=f_{gcd(a,b)}) 的性质,于是又:
[prod_{Tsubseteq S,S
eq varnothing}f_{gcd(T)}^{(-1)^{|T|-1}}
]
设 (f_i=prod_{d|i} g_d),则反演有:
[g_i=prod_{d|i}f_d^{mu(frac{i}{d})}=f_iprod_{d|i,d
eq i}g_d^{-1}
]
于是原式就变为了:
[prod_{Tsubseteq S}left(prod_{d|gcd(T)}g_d
ight)^{(-1)^{|T|-1}}
]
[prod_d g_d^{sumlimits_{Tsubseteq S,d|gcd(T)}(-1)^{|T|-1}}
]
然后考虑那个指数,如果有 (k) 个数是 (d) 的倍数,那么指数上是 (sum_{i=1}^k inom{k}{i}(-1)^{i-1}=[k eq 0])
于是直接 (O(nlog n)) 把 (g) 算出来就行了
#define mod 1000000007
long long power(long long a,long long b){
long long ans=1;
while(b){
if(b&1) ans=ans*a%mod;
a=a*a%mod;b>>=1;
}
return ans;
}
#define N 1000001
int a[N];
long long f[N],g[N];
int main(){
int n=read();
for(int i=1;i<=n;i++) a[read()]=1;
f[1]=f[2]=g[1]=g[2]=1;
for(int i=3;i<N;i++) f[i]=g[i]=(f[i-1]+f[i-2])%mod;
for(int i=1;i<N;i++){
long long invg=power(g[i],mod-2);
for(int j=i+i;j<N;j+=i) g[j]=g[j]*invg%mod,a[i]|=a[j];
}
long long ans=1;
for(int i=1;i<N;i++)if(a[i]) ans=ans*g[i]%mod;
printf("%lld
",ans);
return 0;
}