基础数论--容斥定理

在计数时,必须注意没有重复,没有遗漏。为了使重叠部分不被重复计算,人们研究出一种新的计数方法,这种方法的基本思想是:先不考虑重叠的情况,把包含于某内容中的所有对象的数目先计算出来,然后再把计数时重复计算的数目排斥出去,使得计算的结果既无遗漏又无重复,这种计数的方法称为容斥原理。

容斥定理概述:

 详细证明(归纳法)

 

 例题: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 }

 

posted on 2020-12-19 17:26  greenofyu  阅读(212)  评论(0编辑  收藏  举报