题目链接

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

思路

我们可以直接通过除法来计算每一个质数的倍数有多少个,但是这样的话可能会出现重复计算的情况,例如6是2,3的倍数,所以如果我们的n大于等于6的时候会将这个计算两次,那么我们可以通过容斥原理来计算这个整个集合的数量,我们可以通过二进制枚举或者dfs来枚举我们当前选择的集合(0个数不能算作集合,并且超过n的数也不能算在集合内)

容斥原理的思想:∣S1∣+∣S2∣+∣S3∣−∣S1S2∣−∣S1S3∣−∣S2S3∣+∣S1S2S3∣|S_1| + |S_2| + |S_3| - |S_1 S_2| - | S_1 S_3| - | S_2 S_3| + |S_1 S_2 S_3|∣S1​∣+∣S2​∣+∣S3​∣−∣S1​S2​∣−∣S1​S3​∣−∣S2​S3​∣+∣S1​S2​S3​∣然后以此类推,如果是奇数个元素那么就是做加法,偶数个元素做减法

代码

#include<bits/stdc++.h>
using namespace std;
//----------------自定义部分----------------
#define ll long long
#define mod 1000000007
#define endl "\n"
#define PII pair<int,int>
#define INF 0x3f3f3f3fint dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};ll ksm(ll a,ll b) {ll ans = 1;for(;b;b>>=1LL) {if(b & 1) ans = ans * a % mod;a = a * a % mod;}return ans;
}ll lowbit(ll x){return -x & x;}const int N = 2e6+10;
//----------------自定义部分----------------
ll t,n,m,q,a[N];
void slove(){cin>>n>>m;for(int i = 0;i < m; ++i) cin>>a[i];ll ans = 0;for(int i = 0;i < (1<<m); ++i) {ll cnt = 0LL,res = 1LL;for(int j = 0;j < m; ++j) {if((i >> j) & 1) {res *= a[j],cnt++;if(res > n) {//超过n就不做计算了否则可能会发生溢出cnt = 0;break;}}}if(cnt){if(cnt & 1) ans += n/res;else ans -= n/res;}}cout<<ans<<endl;}int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);t = 1;while(t--){slove();}return 0;
}

AcWing 890. 能被整除的数(容斥原理)相关推荐

  1. Java黑皮书课后题第5章:5.11(找出能被5或6整除的数,但不能同时整除)编写程序,显示从100到1000之间能被5或6整除但不能同时整除的数,每行显示10个。数字之间用一个空格字符隔开

    5.11(编写程序,显示从100到1000之间能被5或6整除但不能同时整除的数,每行显示10个.数字之间用一个空格字符隔开 题目 题目概述 破题 引申:continue break与return 代码 ...

  2. js用循环输出1-1000之间能被5整除的数,且每行输出5个

    思路分析:首先题目中需要的数据都是能被5整除的数,也就是在循环的过程中给每一个i乘以5即可,然后跟空格'\t'符拼接在一起,因为每行要输出5个,也就是说i要被5整除的时候,给它换行,最后输出即可. 代 ...

  3. 求未知数X最临近的能被某个数字N整除的数

    求未知数X最近的能被N整除的数:比X大的临近数:Math.ceil(X/N)*N 比X小的临近数:Math.floor(X/N)*N---------------------------------- ...

  4. python输入正整数n、求n以内能被17整除的最大正整数_求100之内自然数中最大的能被17整除的数...

    . . 1 求 100 之内自然数中最大的能被 17 整除的数 #include void main() { int i ; for (i=100;i>0;i--) if(i%17--0)bre ...

  5. c语言:找出1到4000中,数字的各位数之和能被4整除的数有多少个?

    找出1到4000中,数字的各位数之和能被4整除的数,如:745:7+4+5=16,16可以被4整除:28:2+8=10,10不能被4整除:745就是这样的特殊数字,而28不是,求:这样的数字共有多少个 ...

  6. 初等数论--整除--两数乘积保持整除性

    初等数论--整除--两数乘积保持整除性 m∣r,n∣r,(m,n)=1→mn∣rm\mid r,n\mid r,(m,n)=1\rightarrow mn\mid rm∣r,n∣r,(m,n)=1→m ...

  7. 包含数字和指定字符的正则表达式_Excel公式练习39: 求字符串中的数字组成的数能够被指定数整除的数的个数...

    学习Excel技术,关注微信公众号: excelperfect 导语:继续研究来自于excelxor.com的案例.这个案例比较复杂,需要仔细研究. 本次的练习是:在单元格A1中输入一个任意长度的字母 ...

  8. Java黑皮书课后题第5章:5.10(找出能被5和6整除的数)编写程序,显示从100到1000之间所有能被5和6整除的数,每行显示10个。数字之间用一个空格字符隔开

    5.10(找出能被5和6整除的数)编写程序,显示从100到1000之间所有能被5和6整除的数,每行显示10个.数字之间用一个空格字符隔开 题目 题目概述 破题 引申:continue break与re ...

  9. 计算1-100之间 所有能被3 不能被 5整除的数 的 个数,每行打印 5 个

    package Day05; public class Test_06 { //5.计算1-100之间 所有能被3 不能被 5整除的数 的 个数,每行打印 5 个 public static void ...

最新文章

  1. PHP empty、isset、isnull的区别
  2. SqlServer跨域查询
  3. Oracle中压缩数据节省空间和提高速度
  4. Count Subrectangles CodeForces - 1323B(思维)
  5. open*** 结合pam_mysql认证 failed to authenticate: Permission denied
  6. python123第6周答案_Python123测验6: 组合数据类型 (第6周)
  7. ExtJS,JQuery,Dojo的小比较
  8. R语言data manipulation学习笔记之创建变量、重命名、数据融合
  9. 帅爆了!推荐10款程序员专用高清壁纸!!
  10. C# 线程安全的单例模式
  11. 阿里矢量图标及其引入方式
  12. python for line in file 只能读取一遍
  13. 2020年阴历二月二十 读书笔记~漫步华尔街③
  14. QNX和linux的区别 -- qnx4.0 内核介绍 -- 微内核 -- qnx与vxworks区别
  15. 动点四边形周长最短_中考数学之四边形周长最小值
  16. node-java_node-jvm
  17. BLDC无刷电机驱动板,foc驱动板,有霍尔接口,反电动势接口,三相电流采集接口
  18. MIPI摄像头工程=7系列FPGA + OV5640(MIPI) + 15 分钟 + VITIS
  19. 零基础学浙大翁恺C语言(2):计算
  20. mac上用Homebrew安装redis并启动

热门文章

  1. Webpack4 学习笔记二 CSS模块转换
  2. ComBox、listBox、checklistBox控件
  3. Havel-Hakimi定理 POJ1659
  4. 【Cocos2d入门教程五】Cocos2d-x动作篇
  5. 判别模型、生成模型和朴素贝叶斯模型
  6. ASP.net Ajax 调用Web Service
  7. Android 中的线程有哪些,原理与各自特点
  8. 11.18 Apache用户认证11.19/11.20 域名跳转11.21 Apache访问日志
  9. IDEA快捷键整理(最详细的)
  10. React-Native开发App,修改图标和名字