hdu1796 How many integers can you find(容斥原理裸)
来源:互联网 发布:取消软件定位系统 编辑:程序博客网 时间:2024/06/04 17:43
http://acm.hdu.edu.cn/showproblem.php?pid=1796
题意:求小于n的数中有多少个能被集合m中元素整除。
思路:挑战上的裸题,还基本是看的别人的思路,只学了一种深搜。就如书上所说我们利用的是m比较小的条件,容斥原理说白了就是被覆盖奇数次的个数加上,被覆盖偶数次的个数减去,以达到不重复计算的效果。
比如:集合m的元素有2、3、4、5
我们先看小于n的数中能被2整除的,再看能被2、3共同整除的,再看能被2、3、4共同整除的,再看能被2、3、4、5共同整除的,再看能被2、4、5共同整除的...通过穷举列出任意的组合。但是能被2整除的必然包含能被2、3共同整除的,所以要减去,这样下次算上能被3整除的元素时候就不会重复。归纳一下,就是能被奇数个集合元素整除的数必然包含能被偶数个集合元素共同整除的,所以要减去,这样下次算上能被(奇数个+2的集合元素)整除的元素时候就不会重复。(有点绕= =)简称奇加偶减。中间比如能被2、3、4共同整除的其实就是能被他们最小公倍数整除的数,保证正确性。
深搜相对比较容易理解。
本题注意n值太大和m集合元素是非负数。
#include <stdio.h>#include <algorithm>using namespace std;typedef long long ll;const int N = 11;ll n, cnt, num[N], ans;ll gcd(ll a, ll b){ if(b == 0) return a; return gcd(b, a%b);}ll lcm(ll a, ll b){ return a*b/gcd(a, b);}void dfs(ll th, ll now, ll step){ if(step > cnt) return; ll LCM = lcm(now, num[th]); if(step&1) ans += (n-1)/LCM; else ans -= (n-1)/LCM; for(ll i = th+1; i < cnt; i++) dfs(i, LCM, step+1);}int main(){ // freopen("in.txt", "r", stdin); ll m, val; while(~scanf("%I64d%I64d", &n, &m)) { cnt = 0; ans = 0; while(m--) { scanf("%I64d", &val); if(val>0 && val<n) num[cnt++] = val; } for(int i = 0; i < cnt; i++) { dfs(i, num[i], 1); } printf("%I64d\n", ans); } return 0;}
0 0
- hdu1796 How many integers can you find----容斥原理
- hdu1796--How many integers can you find--容斥原理
- hdu1796---How many integers can you find(容斥原理)
- hdu1796 How many integers can you find 容斥原理
- hdu1796 How many integers can you find 容斥原理
- 【容斥原理】HDU1796 How many integers can you find
- HDU1796 How many integers can you find (容斥原理)
- hdu1796 How many integers can you find (容斥原理)
- hdu1796 How many integers can you find(容斥原理裸)
- hdu1796--How many integers can you find(容斥原理)
- hdu1796(容斥原理模板,三种方法实现)How many integers can you find
- HDU1796 How many integers can you find【容斥定理】
- 容斥定理 hdu1796 How many integers can you find
- hdu1796 How many integers can you find(容斥)
- HDU1796 How many integers can you find[容斥定理]
- HDU1796 How many integers can you find(容斥)
- hdu1796—How many integers can you find(简单容斥)
- hdu1796 How many integers can you find
- 第15章 ByteBuf和相关辅助类
- c++ STL "set"
- 归并排序 --分治初探
- 二分查找 查找非常大的数中的非常多的数
- 第二章、线性表
- hdu1796 How many integers can you find(容斥原理裸)
- 巧用空值判断函数nvl()
- 输出国际键盘
- 模拟退火算法
- Java的transient关键字
- HTML&CSS之边界合并和边界溢出
- TODO:数据库优化之分页
- QT—base20161123
- CentOS6.7下使用cmake编译安装MySQL5.5.32