suxxsfe

一言(ヒトコト)

LOJ6102「2017 山东二轮集训 Day1」第三题

https://loj.ac/p/6102

\(\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;
}
posted @ 2021-10-15 07:59  suxxsfe  阅读(21)  评论(0编辑  收藏  举报