容斥原理——數學知識
容斥原理
可以描述如下:
要計算幾個集合並集的大小,我們要先將所有單個集合的大小計算出來,然後減去所有兩個集合相交的部分,再加回所有三個集合相交的部分,再減去所有四個集合相交的部分,依此類推,一直計算到所有集合相交的部分。
用維恩圖來表示集合A、B和C:
經典例題
AcWing 890. 能被整除的數
給定一個整數n和m個不同的質數p1,p2,…,pm。
請你求出1~n中能被p1,p2,…,pm中的至少一個數整除的整數有多少個。
輸入格式
第一行包含整數n和m。
第二行包含m個質數。
輸出格式
輸出一個整數,表示滿足條件的整數的個數。
資料範圍
1≤m≤16,
1≤n,pi≤109
輸入樣例:
10 2
2 3
輸出樣例:
7
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
const int N = 20;
int p[N];
int main()
{
int n, m;
cin >> n >> m;
for (int i = 0; i < m; i ++ ) cin >> p[i];
int res = 0;
for (int i = 1; i < 1 << m; i ++ ) // i<1<<m 組合數 2^m-1
{
int t = 1, s = 0;//s用來記錄這種方案,選擇的數的個數,從而判斷應該加還是減;t存累乘的結果
for (int j = 0; j < m; j ++ )//遍歷二進位制的每一位
if (i >> j & 1)//判斷二進位制第j位是否存在
{
if ((LL)t * p[j] > n)//這裡要加long 否則會溢位
{
t = -1;
break;
}
t *= p[j];
s ++ ;
}//為這種方案求出一個總乘積t
if (t != -1)
{
if (s % 2) res += n / t;//奇數個數,說明要加
else res -= n / t;//偶數個數,說明要減
}
}
cout << res << endl;
return 0;
}
相關文章
- 容斥原理
- 容斥原理學習筆記筆記
- 【模板】容斥原理
- HDU 4135 Co-prime(容斥原理+分解質因數)
- CodeForces571A. Lengthening Sticks(組合數學-容斥)
- 容斥
- P1447 [NOI2010] 容斥原理
- 反射容斥反射
- 「數學」助力每一個不知死活的容斥夢
- Min-Max 容斥學習筆記筆記
- Min-Max 容斥
- lg容斥與反演
- cf449D. Jzzhu and Numbers(容斥原理 高維字首和)
- 彩票的數學知識
- HDU 4135——Co-prime(容斥原理&&二進位制列舉)
- HTML5中手勢原理分析與數學知識的實踐HTML
- 跳出初學MySQL知識的原理整理(一)MySql
- 容斥定理 AtCoder——FizzBuzz Sum Hard
- 一些數學知識&題
- 數學知識巧學JCF(Java Collections framework)JavaFramework
- P4178 Tree——點分治 容斥
- 00023 高等數學(工本) 知識總結
- 常用程式碼模板4——數學知識
- 冷知識:數學常數“e”的傳奇故事
- 機器學習數學知識積累總結機器學習
- Android面試之——數學基礎知識Android面試
- 機器學習數學知識積累之數理統計機器學習
- 機器學習數學知識積累之高等數學微積分機器學習
- 機器學習數學知識積累之概率論機器學習
- 初學Java該學哪些知識?這6大知識必學Java
- 動手學深度學習需要這些數學基礎知識深度學習
- mysql併發控制原理知識點MySql
- 機器學習中那些必要又困惑的數學知識機器學習
- matlab實現人臉識別(數學基礎原理)Matlab
- 記錄:演算法題數學知識總結演算法
- web知識學習Web
- 想從事資料科學領域,需要多少數學知識?資料科學
- 2019年,該怎樣去系統學大資料,知識+內容+教程大資料