zoukankan      html  css  js  c++  java
  • codeforces 803 F. Coprime Subsequences (莫比乌斯反演)

    题目链接:https://codeforces.com/problemset/problem/803/F

    按莫比乌斯函数系数容斥即可,统计 (gcd) 至少为 (i) 的子序列的数量,即 (i) 的倍数的数选或不选,方案数为 (2^{size[i]}-1)

    统计序列中 (i) 的倍数的元素的个数,(O(nlogn)) 枚举倍数统计即可

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    
    const int maxn = 100010;
    const int M = 1000000007;
    
    int n, cnt;
    int a[maxn];
    int prime[1000010], mu[1000010], is_prime[1000010];
    
    vector<int> fac[1000010];
    
    int qsm(int i, int po){
    	int res = 1;
    	while(po){
    		if(po & 1) res = 1ll * res * i % M;
    		i = 1ll * i * i % M;
    		po >>= 1;
    	}
    	return res;
    }
    
    ll read(){ ll s = 0, f = 1; char ch = getchar(); while(ch < '0' || ch > '9'){ if(ch == '-') f = -1; ch = getchar(); } while(ch >= '0' && ch <= '9'){ s = s * 10 + ch - '0'; ch = getchar(); } return s * f; }
    
    int main(){
    	mu[1] = 1;
    	for(int i = 2; i <= 1000000; ++i){
    		if(!is_prime[i]){
    			prime[++cnt] = i;
    			mu[i] = -1;
    		}
    		for(int j = 1 ; j <= cnt && prime[j] * i <= 1000000 ; ++j){
    			is_prime[i * prime[j]] = 1;
    			if(i % prime[j] == 0) {
    				mu[i * prime[j]] = 0;
    				break;
    			} else {
    				mu[i * prime[j]] = -mu[i];
    			}
    		}
    	}
    	
    	n = read();
    	int c1 = 0;
    	for(int i = 1 ; i <= n ; ++i) {
    		a[i] = read();
    		if(a[i] == 1) ++c1;
    	}
    	
    	for(int i = 1 ; i <= n ; ++i){
    		for(int j = 1 ; j <= (int)sqrt(a[i]+0.5) ; ++j){
    			if(a[i] % j == 0){
    				fac[j].push_back(a[i]);
    				if(j * j != a[i]) fac[a[i]/j].push_back(a[i]);
    			}
    		}
    	}
    	
    	int ans = ((qsm(2, n) - 1) % M + M) % M;
    	for(int i = 2 ; i <= 1000000 ; ++i){
    		if(mu[i] != 0 && fac[i].size()){
    			ans = ((ans + 1ll * mu[i] * (qsm(2, fac[i].size()) - 1) % M) % M + M) % M;
    		}
    	}
    	printf("%d
    ", ans);
    	
    	return 0;
    }
    
  • 相关阅读:
    二叉查找树的实现(可执行代码)
    二叉树的各种实现(创建,叶子结点数,是否为堆,完全二叉树,二叉查找树,交换左右孩子)
    toString()和String.valueof()比较
    双向循环链表(插入,删除,就地逆置)
    JSON
    XPath
    CSS3 新增的文本属性
    DOM操作XML文件
    表单处理
    事件绑定与深入详解
  • 原文地址:https://www.cnblogs.com/tuchen/p/15243694.html
Copyright © 2011-2022 走看看