容斥原理--题

2016.1.27


试题描述

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


输入

输入n,m,和含有m个元素的集合,三者用空格分开

输出

输出可以整除a中一个元素的个数。

输入示例

100 2 {2,3}

输出示例

67

其他说明

限制条件:1≤n≤10的9次方。 1≤m≤15

题干上四个大字容斥原理,你还有什么道理不用!

状压暴搜都可以的啦~

AC代码:

#include<iostream>
using namespace std;
int n,m,a[20],ct,tot,ans;
char ch;
inline int read()
{
    int x,f=1;char ch=getchar();
    for(;!isdigit(ch);ch=getchar()) if(ch==‘-‘) f=-1;
    for(x=ch-‘0‘;isdigit(ch=getchar());x=x*10+ch-‘0‘);
    return x*f;
}
int main()
{
    n=read();m=read();
    for(int i=1;i<=m;i++) a[i]=read();
    for(int i = (1 << m) - 1 ; i >= 1 ; i-- )
    {
        ct=0;tot=1;
        for(int j = m - 1 ; j >= 0 ; j-- )
        {
            if(1<<j & i) ct++,tot*=a[j+1];
        }
        tot=n/tot;
        if(ct+1 & 1) tot=-tot;
        ans+=tot;
    }
    cout<<ans;
}

时间: 2024-10-11 00:11:26

容斥原理--题的相关文章

[Codeforces 1228E]Another Filling the Grid (排列组合+容斥原理)

[Codeforces 1228E]Another Filling the Grid (排列组合+容斥原理) 题面 一个\(n \times n\)的格子,每个格子里可以填\([1,k]\)内的整数.要保证每行每列的格子上的数最小值为1,有多少种方案 \(n \leq 250,k \leq 10^9\) 分析 这题有\(O(n^3)\)的dp做法,但个人感觉不如\(O(n^2 \log n)\)直接用数学方法求更好理解. 考虑容斥原理,枚举有\(i\)行最小值>1,有\(j\)行最小值>1,那

1284 2 3 5 7的倍数

分析: 此题是典型的容斥原理题,一开始理解错误,写成了丑数题,反正一直超时,后来才发现: 要求不是2,3,5,7的倍数的个数,可以先求出2,3,5,7的个数,之后通过n减去2,3,5,7的倍数的个数可求得不是2,3,5,7的倍数的个数: 而要知道2,3,5,7的倍数的个数,只需要分别知道2的倍数个数,3的倍数个数,5的倍数个数,7的倍数的个数,之后通过容斥原理(先不考虑重叠的情况,把包含于某内容中的所有对象的数目先计算出来,然后再把计数时重复计算的数目排斥出去,使得计算的结果既无遗漏又无重复,这

容斥 - HDU 4135 Co-prime

Co-prime Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=4135 推荐: 容斥原理 Mean: 给你一个区间[l,r]和一个数n,求[l,r]中有多少个数与n互素. analyse: 经典的容斥原理题. 如果题目是说求1~n中有多少个数与n互质,我们一定反应应该是欧拉函数. 但是如果n特别大或者说是求某个给定区间与n互素的个数,这时用欧拉函数就行不通. 容斥做法:首先我们可以在O(sqrt(n))内求出n的所有质因数p

2014鞍山现场赛C题HDU5072(素筛+容斥原理)

Coprime Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 130    Accepted Submission(s): 59 Problem Description There are n people standing in a line. Each of them has a unique id number. Now t

HDU1695:GCD(容斥原理+欧拉函数+质因数分解)好题

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1695 题目解析: Given 5 integers: a, b, c, d, k, you're to find x in a...b, y in c...d that GCD(x, y) = k. 题目又说a==c==1,所以就是求[1,b]与[1,d]中gcd等于k的个数,因为若gcd(x,y)==z,那么gcd(x/z,y/z)==1,又因为不是z的倍数的肯定不是,所以不是z的倍数的可以直接去

CF GYM100548 (相邻格子颜色不同的方案数 2014西安区域赛F题 容斥原理)

n个格子排成一行,有m种颜色,问用恰好k种颜色进行染色,使得相邻格子颜色不同的方案数. integers n, m, k (1 ≤n, m ≤ 10^9, 1 ≤ k ≤ 10^6, k ≤ n, m). m种颜色取k种 C(m, k) 这个可以放最后乘 那么问题就变成只用k种颜色第一个格子有k种涂法 第二个有k-1种 第三个也是k-1种 一共就是k*(k-1)^(n-1) 这种算法仅保证了相邻颜色不同,总颜色数不超过k种,并没有保证恰好出现k种颜色 也就是多算了恰好出现2种 恰好出现3种...

hdu4135Co-prime 容斥原理水题

//问一个区间[a,b]与n互素的数的个数 //利用容斥原理可知 //在[a,b] 区间内对n的素数因子 //ans = 被一个数整除的数的个数 - 被两个数的最小公倍数整除的数的个数 + 被三个数的... #include<cstdio> #include<cstring> #include<iostream> using namespace std ; const int maxn = 100010 ; typedef __int64 ll ; ll p[maxn]

2014ACM/ICPC亚洲区西安站 F题 color (组合数学,容斥原理)

题目链接:传送门 题意: n个格子排成一行,我们有m种颜色,可以给这些格子涂色,保证相邻的格子的颜色不同 问,最后恰好使用了k种颜色的方案数. 分析: 看完题目描述之后立马想到了一个公式 :C(m,k)*k*(k-1)^(n-1),但是仔细分析了一下 这个公式的含义是相邻的格子颜色不同,使用的颜色总数小于等于k的方案数,但是这个 公式可以帮忙我们衍生出来下面的公式,C(k,x)*x*(x-1)^(n-1),这个公式的含义是在这 k种颜色中再选出来x种使得相邻的格子不同色最后的颜色数小于等于x,然

codeforces 100548F (西安现场赛F题):容斥原理

题目大意: 对n个排成一排的物品涂色,有m种颜色可选. 要求相邻的物品颜色不相同,且总共恰好有K种颜色,问所有可行的方案数 分析: 从m种颜色中选出k种,有c(m,k)种方法,那么我们只用考虑 k种颜色的涂法即可 显然第一个物品有k种涂法,后面的因为不能跟前面的相同都只有k-1种涂法 因此容易想到一个公式:k*(k-1)^(n-1) 但是这个公式算的是 不超过k种颜色的涂法,题目要求必须k种,怎么办呢? 先考虑一个简化版的问题: 用而且用完5种颜色涂不相关的五个物品的方案数 用阶乘的方法可以算出