容斥原理

UVA10325 The Lottery [容斥原理]

巧了我就是萌 提交于 2020-02-21 08:02:39
容斥入门题一道, 蒟蒻的第一道自己yy出的容斥 其实就是你统计出 n n 以内能被整除的个数,再用总个数减去可行的个数,就是不可行的个数啦,但是对于 2 31 2 31 ,显然不能枚举,那么就容斥吧。 我们先对于一个数 x x , n n 以内能被他整除的个数就是 n / x n / x 向下取整这么多个,所以就可以 O ( 1 ) O ( 1 ) 的统计出这个个数。但对于多个数字,如果你加上对于 x x 和 y y 分别的能被整除的个数的话,那么既能被 x x 整除的又能被 y y 整除的就多算了一次,(可以自己在本子上画维恩图理解),那么就要减去多算的个数,然后依次类推啦。 上代码: #include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; ll n,m,a,b; ll ans,num[20]; ll gcd(ll a,ll b){ if(!b) return a; else return gcd(b,a%b); } ll lcm(ll a,ll b){ return a/gcd(a,b)*b; } void dfs(int pos,ll a,int pd){ ll now=-1ll; if(!pd) now=1ll; if(pos)ans+=

容斥原理

爱⌒轻易说出口 提交于 2019-12-20 02:53:04
题目描述:给定A, B, N (1 <= A <= B <= 10^15,1<=N <= 10^9).求[A,B]区间内与N互素的数的个数 步骤: (1)将问题化为求1~B,1~A中与N互素的数的个数的差,当然考虑到A可能与N互素的情况,在实际操作时, 即求1~A时最好改成求1~A-1(包含A-1); (2)求N的质因子(可参考:http://blog.csdn.net/yzj577/article/details/38148087); (3)直接运用容斥原理(关于容斥原理的知识,可参考:http://baike.baidu.com/view/573741.htm?fr=aladdin) 现在问题的关键是如何通过代码实现容斥原理,看到某博客说有三种可行的方法:dfs(深搜),队列数组, 位运算,而我们在课上讲的是用位运算来实现的,所以我在这里用位运算来做。 举例: 求1~50中与N=30互素的个数,30=2*3*5*,结果为50-50/2-50/3-50/5+50/(2*3)+50/(2*5)+50/(3*5)-50/(2*3*5) 如果用’0‘和’1‘标记2,3,5,为’1‘时要除50,为’0‘时不需,那么,二进制数000,001,010,011,······,111, 不就刚好对应上式中的2,3,5在除数中出现的情况,001—-2, 010—-3,011—-3*2,110—-5

组合数学—容斥原理与鸽巢原理

假装没事ソ 提交于 2019-12-05 21:05:14
目录 一 写在开头 二 容斥原理 三 鸽巢原理 四 Ramsey定理 五 Burnside引理与波利亚定理 注:原创不易,转载请务必注明原作者和出处,感谢支持! 一 写在开头 本文内容为《组合数学》课程的最后一部分,容斥原理与鸽巢原理。这部分的内容分解图如下。 二 容斥原理 如下图所示。可以得到容斥原理的简单形式 \[ \begin{equation} \begin{split} \vert A \cup B \cup C \vert &= \vert A \vert + \vert B \vert + \vert C \vert\\ &- \vert A \cap B \vert - \vert A \cap C \vert - \vert B \cap C \vert\\ &- \vert A \cap B \cap C \vert \end{split} \end{equation} \] 全或形式的容斥原理如下 \[ \begin{equation} \begin{split} \vert A_1 \cup A_2 \cup ... \cup A_n \vert &= \sum_{i=1}^n \vert A_i \vert\\ &-\sum_{i=1}^n \sum_{j > i} \vert A_i \cap A_j \vert\\ &+\sum_{i=1}^n

容斥原理

别来无恙 提交于 2019-11-30 06:28:06
\(A \cup B\) , \(A\) 交 \(B\) \(|A \cup B \cup C|=(A+B+C)-(A \cap B+B \cap C+A \cap C)\) \(|A \cup B \cup C \cup D|=......\) \(|A_1 \cup A_2...A_n|=\sum_{} A_i - \sum_{} A_i \cap A_j+ \sum_{i<j<k}A_i \cap A_j \cap A_k\) ... 来源: https://www.cnblogs.com/defense/p/11568462.html

容斥原理相关

不打扰是莪最后的温柔 提交于 2019-11-29 11:47:45
一.补集转化. 有些计数题直接做并不好做,但是统计所有情况和它的反面情况更加容易的时候,我们就可以考虑用所有情况减去反面情况来做. 形式化的,若集合 S S S 的大小不好求,但是对于一个集合 U U U 满足 S ⊆ U S \subseteq U S ⊆ U , U U U 的大小很好求,而且同时 S S S 的补集 ∁ U S \complement_{U}^{S} ∁ U S ​ 的大小也很好求,那么就可以使用这个式子: ∣ S ∣ = ∣ U ∣ − ∣ ∁ U S ∣ |S|=|U|-|\complement_{U}^{S}| ∣ S ∣ = ∣ U ∣ − ∣ ∁ U S ​ ∣ 很多计数题中都需要用到这个套路,我们称这个套路为 补集转化 . 二.容斥原理. 考虑对于一种情况下,我们要求 ⋃ i = 1 n S i \bigcup_{i=1}^{n}S_i ⋃ i = 1 n ​ S i ​ 的大小,但是那并不好求怎么办? 考虑两个集合的情况,可以补集转化,先分别加上 S 1 S_1 S 1 ​ 和 S 2 S_2 S 2 ​ 的大小,再减去 S 1 ∩ S 2 S_1\cap S_2 S 1 ​ ∩ S 2 ​ 的大小. 形式化的,即: ∣ S 1 ∪ S 2 ∣ = ∣ S 1 ∣ + ∣ S 2 ∣ − ∣ S 1 ∩ S 2 ∣ |S_1\cup S_2|=

#(树形DP+容斥原理)洛谷P3047 [USACO12FEB]附近的牛Nearby Cows

前提是你 提交于 2019-11-28 08:55:25
题目描述 Farmer John has noticed that his cows often move between nearby fields. Taking this into account, he wants to plant enough grass in each of his fields not only for the cows situated initially in that field, but also for cows visiting from nearby fields. Specifically, FJ's farm consists of N fields (1 <= N <= 100,000), where some pairs of fields are connected with bi-directional trails (N-1 of them in total). FJ has designed the farm so that between any two fields i and j, there is a unique path made up of trails connecting between i and j. Field i is home to C(i) cows, although cows

2 3 5 7 的倍数 (容斥原理)

老子叫甜甜 提交于 2019-11-26 04:54:28
Description: 给出一个数N,求1至N中,有多少个数不是2 3 5 7的倍数。 例如N = 10,只有1不是2 3 5 7的倍数。 Input 输入1个数N(1 <= N <= 10^18)。 Output 输出不是2 3 5 7的倍数的数共有多少。 Input示例 10 Output示例 1 容斥原理:先不考虑重叠的情况,把包含于某内容中的所有对象的数目先计算出来,然后再计数是重复的数目排除出去,使将计算的结果既无遗漏又无重复。 假如有两个集合:A于B,则AUB = A+B-AB 三个集合:A与B与C,AUBUC = A + B + C - AB - AC - BC + ABC 四个集合,可以想象成3维的,AUBUCUD = A+B+C+D -AB-AC-AD-BC-BD-CD + ABC+ABD+BCD+ABD -ABCD; AC代码: #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<vector> #include<stdlib.h> #include<queue> #include<map> #include<iomanip> #include<math.h> const int INF = 0x3f3f3f3f; using namespace