zoukankan      html  css  js  c++  java
  • LOJ6102「2017 山东二轮集训 Day1」第三题

    https://loj.ac/p/6102

    (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;
    }
    
  • 相关阅读:
    存货核算中的加权平均
    System stored procedures
    javascript中replace与正则表达式
    AfxGetApp 解剖
    MFC中的文字输出
    函数指针的应用
    MFC消息处理与SDK消息处理
    在本地机器上获取root权限
    文件内容读取
    Linux下安装windows系统的方法
  • 原文地址:https://www.cnblogs.com/suxxsfe/p/15409399.html
Copyright © 2011-2022 走看看