算法实现

    xiaoxiao2021-03-25  75

    容斥原理

    给定a1, a2, a3 , … ,am, 求1到n的整数中至少能整除a中一个元素的数有几个?


    #include<stdio.h> #define MAX_M 8 typedef long long ll; int a[MAX_M]; int n, m; int gcd(int a, int b) { if (b) while ((a %= b) && (b %= a)); return a + b; } int solve() { ll res = 0; //以二进制的形式讨论 for (int i = 1; i < (1 << m); i++) { int num = 0; for (int j = i; j != 0; j >>= 1)num += j & 1; ll lcm = 1; for (int j = 0; j < m; j++) { if (i >> j & 1) { lcm = lcm / gcd(lcm, a[j])*a[j]; if (lcm > n)break; } } if (num % 2 == 0) res -= n / lcm; else res += n / lcm; } printf_s("%d\n", res); return res; } int main() { scanf_s("%d%d", &n,&m); for (int i = 0; i < m; i++) { scanf_s("%d",&a[i]); } solve(); return 0; }
    转载请注明原文地址: https://ju.6miu.com/read-39258.html

    最新回复(0)