[Codeforces Round #325][Div.1 E]

题目

http://codeforces.com/contest/585/problem/E
n stamps,要求你选出一个数x,再选出一个 GCD>1 的集合 S ,要求GCD(x,GCD(S))=1

分析

题目太神QAQ。
考虑选出一个非空集合 SGCD(S)=k 的情况有多少种
假设有 cnt 个数是 k 的倍数
ans[k]表示 GCD(S)>=k 的集合的个数
则有 ans[k]=2cnt1
那么答案应该是

A[k]=ans[k]k|jans[j]

我们已经知道了 GCD=k 的情况有多少种,再考虑选出一个数与k互质的情况
但是很难求,还是考虑容斥
选出一个数和 k GCD一定是 <=k <script type="math/tex" id="MathJax-Element-3795"><=k</script>的
考虑 k 是一个质数的情况
不妨计算选出一个数使得GCD<k的个数
那么答案为不选k的倍数 Ans=2cnt(i)(ncnt(i))
考虑 k 是两个质数的乘积,答案为一个质数的答案+另一个质数的答案-两个质数乘积的答案。莫比乌斯函数?
cnt(k) a1.....an 中是 k 的倍数的个数
Ans=i=1nmu[i]2cnt(i)(ncnt(i))

其中 mu[i] 为莫比乌斯函数

A 数组的容斥过程类似,可以一起容斥
代码很简练OTZ

#include <bits/stdc++.h>
#define maxn 10000010
using namespace std;

int n, a[maxn], h[maxn];

int mu[maxn], p[maxn], primes;

bool vis[maxn];

const int N = maxn - 10;

const long long mod = 1e9 + 7;

long long pow2[maxn];

int main(){
    scanf("%d", &n);
    for(int i = 1; i <= n; i ++)
        scanf("%d", &a[i]), h[a[i]] ++;

    long long t;
    mu[1] = 1;

    for(int i = 2; i <= N; i ++){
        if(!vis[i]){p[primes ++] = i; mu[i] = -1;}
        for(int j = 0; j < primes; j ++){
            if((long long)p[j] * i > N)break;
            vis[p[j] * i] = true;
            if(i % p[j] == 0){mu[p[j] * i] = 0; break;}
            mu[p[j] * i] = -mu[i];
        }
    }
    pow2[0] = 1;
    for(int i = 1; i <= N; i ++)pow2[i] = (pow2[i-1] << 1) % mod;
    long long Ans = 0;
    for(int i = 2; i <= N; i ++){
        if(mu[i] == 0)continue;
        int c = 0;
        for(int j = i; j <= N; j += i)
            c += h[j];
        if(c == 0)continue;
        t = (pow2[c] - 1) * (n - c) % mod;
        if(mu[i] == -1)Ans = (Ans + t) % mod;
        else Ans = (Ans - t + mod) % mod;
    }
    printf("%I64d\n", Ans % mod);
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值