hdu 1796

在 $< n$ 的数中能被 $x$ 整除的数的个数为 $(n - 1) / x$
在 $< n$ 的数中能被 $x, y$ 整除的数的个数为 $(n - 1) / lcm(x, y)$
......

考虑容斥
$Answer = \sum_{i = 1} ^ {tot} (-1) ^ {(i + 1)} (n - 1) / (A 集合中任意 i 个数的 lcm)$

#include <iostream>
#include <cstdio>

using namespace std;
const int N = 30;

int A[N], n, m;
int ans, tot;

int Gcd(int a, int b) {return b == 0 ? a : Gcd(b, a % b);}

void Dfs(int pos, int pre_lcm, int k) {
    for(int i = pos + 1; i <= tot; i ++) {
        int lcm = pre_lcm / Gcd(pre_lcm, A[i]) * A[i];
        if(k & 1) ans += (n - 1) / lcm;
        else ans -= (n - 1) / lcm;
        Dfs(i, lcm, k + 1);
    }
}

int main() {
    while(scanf("%d%d", &n, &m) == 2) {
        ans = 0, tot = 0;
        for(int i = 1; i <= m; i ++) {
            int x; scanf("%d", &x);
            if(x > 0 && x < n) A[++ tot] = x;
        }
        Dfs(0, 1, 1);
        cout << ans << "\n";    
    }
    return 0;
}

 

posted @ 2018-08-22 10:58  xayata  阅读(215)  评论(0编辑  收藏  举报