1. 程式人生 > 實用技巧 >基礎數論--容斥定理

基礎數論--容斥定理

在計數時,必須注意沒有重複,沒有遺漏。為了使重疊部分不被重複計算,人們研究出一種新的計數方法,這種方法的基本思想是:先不考慮重疊的情況,把包含於某內容中的所有物件的數目先計算出來,然後再把計數時重複計算的數目排斥出去,使得計算的結果既無遺漏又無重複,這種計數的方法稱為容斥原理。

容斥定理概述:

詳細證明(歸納法)

例題:https://www.acwing.com/problem/content/892/

 1 #include<iostream>
 2 using namespace std;
 3 const int N=20;
 4 int primes[N];
 5 int main(void
){ 6 int n,m; 7 cin>>n>>m; 8 for(int i=0;i<m;i++){ 9 cin>>primes[i]; 10 } 11 int res=0; 12 for(int i=1;i < 1<<m;i++){ 13 int cnt=0; 14 int t=1; 15 for(int j=0;j<m;j++){ 16 if(i>>j&1){ 17 cnt++;
18 if((long long)t*primes[j]>n){ 19 t=-1; 20 break; 21 } 22 t*=primes[j]; 23 } 24 } 25 if(t!=-1){ 26 if(cnt%2) 27 res+=n/t; 28 else 29 res-=n/t;
30 } 31 32 } 33 cout<<res<<endl; 34 return 0; 35 }