LOJ6102「2017 山东二轮集训 Day1」第三题
把 \(\operatorname{lcm}\) 转化成 \(\gcd\),就是对每个因子应用一下 min-max 容斥:
\[\operatorname{lcm}(S)=\prod_{T\subseteq S,S\neq \varnothing}\gcd(T)^{(-1)^{|T|-1}}
\]
然后由于斐波那契数列有 \(\gcd(f_a,f_b)=f_{\gcd(a,b)}\) 的性质,于是又:
\[\prod_{T\subseteq S,S\neq \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_i\prod_{d|i,d\neq i}g_d^{-1}
\]
于是原式就变为了:
\[\prod_{T\subseteq S}\left(\prod_{d|\gcd(T)}g_d\right)^{(-1)^{|T|-1}}
\]
\[\prod_d g_d^{\sum\limits_{T\subseteq S,d|\gcd(T)}(-1)^{|T|-1}}
\]
然后考虑那个指数,如果有 \(k\) 个数是 \(d\) 的倍数,那么指数上是 \(\sum_{i=1}^k \binom{k}{i}(-1)^{i-1}=[k\neq 0]\)
于是直接 \(O(n\log 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\n",ans);
return 0;
}