当前位置: 首页 > news >正文

算法板子:容斥原理——求出 1∼n 中能被质数 p1,p2,…,pm 中的至少一个数整除的整数有多少个

1. 题目要点

1. 设:求1~10中能被质数2和3中至少一个数整除的数有多少个。1~10中能被质数2整除的数的集合记为S1={2,4,6,8,10},能被质数3整除的数的集合记为S2={3,6,9},能同时被质数2和3整数的数的集合为S1∩S2={6}

2. 这道题的目的是求S1∪S2∪S3这个集合的元素个数,也就是求交集的个数的交错和

3. 集合使用二进制标识:S1集合用二进制位001标识; S2集合用二进制位010标识; S1∩S2交集集合用011来标识。
4. 求每个集合的元素个数:S1集合的元素个数为n/p1,也就是10/2=5; S2集合的元素个数为n/p2,也就是10/3=3; S3集合的元素个数为n/(p1*p2),也就是10/(2*3)=1

2. 代码

#include <iostream>
using namespace std;const int N = 20;// p是质数数组,存储输入样例中给出的所有质数
int p[N];
int n, m;int calc()
{int res = 0;// 枚举所有的集合; m是2,有两个质数,1左移两位是二进制100代表十进制4,也就是说外层循环枚举了二进制001、010、011,也就是枚举了三个集合for (int i = 1; i < 1 << m; i ++ ){int t = 1, sign = -1;// 得到求当前集合个数时的分母tfor (int j = 0; j < m; j ++ ){// 得到当前集合的二进制表示if (i & 1 << j){if (1LL * t * p[j] > n) {t = 0;break;}t *= p[j], sign = -sign;}}// 当前集合的个数为n/tif (t) res += n / t * sign;}return res;
}int main()
{cin >> n >> m;// 初始化质数数组pfor (int i = 0; i < m; i ++ ) cin >> p[i];cout << calc() << endl;return 0;
}

http://www.lryc.cn/news/420616.html

相关文章:

  • 用gurobipy求解带不等式约束条件的优化问题
  • 漏洞复现-Adobe ColdFusion 远程代码执行漏洞(CVE-2023-38203)
  • Spring-MyBatis整合:No qualifying bean of type ‘XXX‘ available: ...
  • gitea docker 快捷安装部署
  • CLAMP-1
  • Blender的Python编程介绍
  • 树莓派4/5:运行Yolov5n模型(文末附镜像文件)
  • 【学习笔记】Day 9
  • Linux网络案例
  • 苹果离线打包机配置和打包
  • 【C++ Primer Plus】学习笔记 5【指针 下】
  • Phpstorm实现本地SSH开发远程机器(或虚拟机)项目
  • API 的多分支管理,让 Apifox 帮你轻松搞定!
  • 线上预约陪诊平台医院陪诊系统源码就医陪护小程序APP开发
  • 240806-在Linux/RHEL开机中自动启动bash脚本
  • 【多线程】乐观/悲观锁、重量级/轻量级锁、挂起等待/自旋锁、公平/非公锁、可重入/不可重入锁、读写锁
  • 31_逻辑漏洞、水平垂直越权、垂直越权漏洞测试、水平越权
  • css写一个按钮流光动画效果
  • AxMath保姆级安装教程(word联用)及使用TIPS
  • Vue-03.指令-v-on
  • 接口基础知识6:详解http request body(一篇讲完常见请求体)
  • Windows Server 安装Web,DHCP,DNS,FTP四大服务及其配置和监控方式
  • 创意指南丨VR游览沉浸式空间体验
  • 【iOS】—— autoreleasePool以及总结
  • 培训第二十五天(python中执行mysql操作并将python脚本共享)
  • LVS实战项目
  • 笔记小结:《利用python进行数据分析》之层次化索引
  • Linux的线程篇章 - 线程池、进程池等知识】
  • 汇昌联信做拼多多运营正规吗?
  • 240810-Gradio自定义Button按钮+事件函数+按钮图标样式设定