AcWing 890. 能被整除的数(模板)

题目链接:点击这里

在这里插入图片描述

暴力时间复杂度为 O ( n m ) O(nm) ,超时。

分析样例,有整数集合 S = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 } S=\left\{ 1,2,3,4,5,6,7,8,9,10\right\} ,质数 p = { 2 , 3 } p=\left\{2,3\right\}

能被 2 2 整除的有 S 2 = { 2 , 4 , 6 , 810 } S_2=\left\{2,4,6,810\right\}

能被 3 3 整除的有 S 3 = { 3 , 6 , 9 } S_3=\left\{3,6,9\right\}

所以,根据容斥原理, S 2 S 3 = S 2 + S 3 S 2 S 3 = 5 + 3 1 = 7 |S_2 \cup S_3| = |S_2|+|S_3|-|S_2 \cap S_3| = 5+3-1=7

推广到 n n m m ,奇加偶减:

S p 1 S p 2 . . . S p m = S p 1 + S p 2 + . . . + S p m S p 1 S p 2 . . . S p 2 S p 3 . . . S p m 1 S p m + S p 1 S p 2 S p 3 + . . . S_{p_1} \cup S_{p_2} \cup ... S_{p_m} = |S_{p_1}|+|S_{p_2}|+...+|S_{p_m}|-|S_{p_1} \cap S_{p_2}|- ... -|S_{p_2} \cap S_{p_3}|-...-|S_{p_{m-1}} \cap S_{p_m}|+|S_{p_1} \cap S_{p_2} \cap S_{p_3}|+...

其中,能被 p 1 p_1 整除的集合元素个数为 S p 1 = n p 1 |S_{p_1}|=\lfloor \frac{n}{p_1} \rfloor

由于互质,所以能被 p 1 p 2 p 3 p_1、p_2、p_3 同时整除的集合元素个数为 S p 1 S p 2 S p 3 = n p 1 p 2 p 3 |S_{p_1} \cap S_{p_2} \cap S_{p_3}|=\lfloor \frac{n}{p_1*p_2*p_3} \rfloor

扫描二维码关注公众号,回复: 9904074 查看本文章

其它集合元素个数的计算方法以此类推。

我们知道,子集共有 2 m 1 2^m-1 个,可以利用二进制枚举子集,其时间复杂度为 O ( 2 m ) O(2^m) ;每个子集还需要算一遍乘法,其时间复杂度为 O ( m ) O(m) ,因此,总时间复杂度为 O ( 2 m m ) O(2^m*m)

#include<iostream>
#include<algorithm>
#include<cstdio>

using namespace std;
typedef long long ll;
const int N = 20;

int n, m;
int p[N];

int main()
{
    scanf("%d%d", &n, &m);
    for(int i = 0 ; i < m; ++i) scanf("%d", &p[i]);
    
    int res = 0;
    for(int i = 1; i < 1 << m; ++i)
    {
        int t = 1, cnt = 0;
        for(int j = 0; j < m; ++j)
        {
            if(i >> j & 1)
            {
                cnt++;
                if((ll)t * p[j] > n)    //p乘起来可能很大
                {
                    t = -1;
                    break;
                }
                t *= p[j];
            }
        }
        
        if(t != -1)
        {
            if(cnt & 1) res += n / t;
            else    res -= n / t;
        }
    }
    
    printf("%d\n", res);
    
    return 0;
}
发布了811 篇原创文章 · 获赞 127 · 访问量 14万+

猜你喜欢

转载自blog.csdn.net/qq_42815188/article/details/104833245