容斥原理(枚举二进制)-HDU1796(重)
来源:互联网 发布:php高级工程师 面试 编辑:程序博客网 时间:2024/06/05 11:41
https://vjudge.net/problem/HDU-1796
将符合条件的m个数,看作m位,每位是0或者是1,那么一共有2^m种状态,只要判断一下每一个状态有多少个1,也就是有多少个数(重叠多少次),记为k,每一个1代表哪几个具体的数,求这几个数的最小公倍数,然后(n-1)/lcm, 利用k的值来判断应该减去还是加上。
参考:http://blog.csdn.net/sr_19930829/article/details/44938217
#include <iostream>#include <cstdio>using namespace std;typedef long long ll;const int inf=0x3f3f3f3f;const int maxn=25;ll num[maxn];//存有效数字int cnt;ll ans;ll n,m;ll gcd(ll a,ll b){ return b==0?a:gcd(b,a%b);}ll LCM(ll a,ll b){ return a*b/gcd(a,b);}int main(){ while(scanf("%I64d%I64d",&n,&m)!=EOF) { cnt=0; ans=0; ll val; for(int i=1;i<=m;i++) { scanf("%I64d",&val); if(val>0&&val<n) num[cnt++]=val; } //***枚举二进制*** for(int i=1;i<(1<<cnt);i++)//把cnt个数看作cnt位,每位是0或者1 { //下面就是求状态i里面有多少个1,也就是重叠多少次,用k表示 int k=0; ll lcm=1; for(int j=0;j<cnt;j++) { if(i&(1<<j)) { k++; lcm=LCM(lcm,num[j]);//求出这k个数的最小公倍数 } } if(k&1) ans+=(n-1)/lcm; else ans-=(n-1)/lcm; } printf("%I64d\n",ans); } return 0;}
阅读全文
0 0
- 容斥原理(枚举二进制)-HDU1796(重)
- 数学 hdu1796(容斥原理+dfs) / (容斥原理+二进制枚举)
- hdu1796(二进制容斥原理基本运用)
- hdu1796(容斥原理)
- hdu1796(容斥原理)
- hdu1796(二进制枚举)
- 二进制枚举(容斥原理)
- hdu1796(容斥原理)
- hdu1796容斥原理
- HDU1796(数论,容斥原理)
- UVA 11806 Cheerleaders (容斥原理+二进制枚举)
- uva 10325 The Lottery (容斥原理)dfs枚举 或二进制枚举
- hdu1796--How many integers can you find(容斥原理)
- hdu1796 How many integers can you find(容斥原理裸)
- hdu1796(容斥原理模板,三种方法实现)How many integers can you find
- hdu1796(容斥原理+最大公约数+DFS)
- 互素,容斥原理,HDU4135 POJ2407 HDU1796
- UVA 10325 The Lottery (组合数学,容斥原理,二进制枚举)
- 1.3 模式识别系统
- css3中颜色值用HSLA表示
- 入驻csdn~
- 前端对称加密--DES加密
- 分享Kali Linux 2017年第29周镜像文件
- 容斥原理(枚举二进制)-HDU1796(重)
- 读Zepto源码之Event模块
- Android 个人中心波纹效果
- main.cpp:14:8: error: stray '\200' in program
- input 输入框两种改变事件的方式
- shell脚本初探——概念篇
- mysql在win10下的安装、连接
- 推荐一个批量改文件名的工具
- Android studio 中调用ndk-build 进行编译native 层直接编译