当前位置:   article > 正文

备战蓝桥杯---组合数学2

备战蓝桥杯---组合数学2

本专题主要介绍容斥原理

大家高中的时候肯定接触过韦恩图,容斥原理比较通俗的理解就是减去所有可能并加上重叠的部分。

我们直接看公式:

知道后,我们先看道模板题:

下面是AC代码:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define int long long
  4. int a[6],n;
  5. signed main(){
  6. a[0]=2;
  7. a[1]=5;
  8. a[2]=11;
  9. a[3]=13;
  10. while(cin>>n){
  11. int sum=0;
  12. for(int i=0;i<=(1<<4)-1;i++){
  13. int cnt=0;
  14. int ww=1;
  15. for(int j=0;j<4;j++){
  16. if((i>>j)&1==1){
  17. ww*=a[j];
  18. cnt++;
  19. }
  20. }
  21. if(cnt%2==0) sum+=n/ww;
  22. else sum-=n/ww;
  23. }
  24. printf("%lld\n",sum);
  25. }
  26. }

接下来看一道有趣的题:

下面是分析:

首先,题目应该改为被1只及以上。同时10^4,显然不能容斥原理,但我们可以借鉴它先减后弥补的思想。

下面是解法(十分的巧妙):

下面是AC代码:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define int long long
  4. int n,m,x;
  5. map<int,int> mp;
  6. int gcd(int a,int b){
  7. while(b){
  8. int tmp=b;
  9. b=a%b;
  10. a=tmp;
  11. }
  12. return a;
  13. }
  14. signed main(){
  15. scanf("%lld%lld",&n,&m);
  16. for(int i=1;i*i<=m;i++){
  17. if(m%i==0){
  18. mp[i]=0;
  19. mp[m/i]=0;
  20. }
  21. }
  22. mp.erase(m);
  23. for(int i=1;i<=n;i++){
  24. scanf("%lld",&x);
  25. int yy=gcd(x,m);
  26. for(map<int,int>::iterator it=mp.begin();it!=mp.end();it++){
  27. if((it->first)%yy==0) mp[it->first]=1;
  28. }
  29. }
  30. int sum=0;
  31. for(map<int,int>::iterator it=mp.begin();it!=mp.end();it++){
  32. if(it->second==0) continue;
  33. int num=m/(it->first);
  34. sum+=((it->first)*(num))*(num-1)/2*(it->second);
  35. for(map<int,int>::iterator it1=it;it1!=mp.end();it1++){
  36. if(it1==it) it1++;
  37. if(it1==mp.end()) break;
  38. if((it1->first)%(it->first)==0) mp[it1->first]-=it->second;
  39. }
  40. }
  41. cout<<sum;
  42. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/104150
推荐阅读
相关标签
  

闽ICP备14008679号