HDU 1796 How many integers can you find(容斥原理)
2017-07-03 15:39
579 查看
题目传送:http://acm.hdu.edu.cn/diy/contest_showproblem.php?cid=20918&pid=1002
[b]题目大意:给定n和一个大小为m的集合,集合元素为非负整数。为1...n内能被集合里任意一个数整除的数字个数。n<=2^31,m<=10[/b]
[b]解题思路:容斥原理地简单应用。先找出1...n内能被集合中任意一个元素整除的个数,再减去能被集合中任意两个整除的个数,即能被它们两只的最小公倍数整除的个数,因为这部分被计算了两次,然后又加上三个时候的个数,然后又减去四个时候的倍数...所以深搜,最后判断下集合元素的个数为奇还是偶,奇加偶减。[/b]
Problem Description
Now you get a number N, and a M-integers set, you should find out how many integers which are small than N, that they can divided exactly by any integers in the set. For example, N=12, and M-integer set is {2,3}, so there is another set {2,3,4,6,8,9,10}, all the integers of the set can be divided exactly by 2 or 3. As a result, you just output the number 7.Input
There are a lot of cases. For each case, the first line contains two integers N and M. The follow line contains the M integers, and all of them are different from each other. 0<N<2^31,0<M<=10, and the M integer are non-negative and won’t exceed 20.Output
For each case, output the number.Sample Input
12 2 2 3
Sample Output
7 [b]启发博客:http://www.cnblogs.com/jackge/archive/2013/04/03/2997169.html[/b]
[b]题目大意:给定n和一个大小为m的集合,集合元素为非负整数。为1...n内能被集合里任意一个数整除的数字个数。n<=2^31,m<=10[/b]
[b]解题思路:容斥原理地简单应用。先找出1...n内能被集合中任意一个元素整除的个数,再减去能被集合中任意两个整除的个数,即能被它们两只的最小公倍数整除的个数,因为这部分被计算了两次,然后又加上三个时候的个数,然后又减去四个时候的倍数...所以深搜,最后判断下集合元素的个数为奇还是偶,奇加偶减。[/b]
#include<cstdio> #include<iostream> using namespace std; long long a[15]; long long ans; int cnt; int n,m; long long gcd(long long b,long long c)//计算最大公约数 { return c==0?b:gcd(c,b%c); } long long lcm(long long b,long long c)//计算最小公倍数 { return b * c/ gcd(b, c); } void dfs(int cur,int num,long long Lcm) //深搜,搜出每一种数学组合的可能,因为m<=10所以不会爆 { Lcm=lcm(Lcm,a[cur]); if(num%2==0) ans-=(n-1)/Lcm; else ans+=(n-1)/Lcm; for(int j=cur+1;j<cnt;j++)//这个j只能放在里面定义!! dfs(j,num+1,Lcm); } //cur指当前数字在数组中的位置,num指目前计算公倍数的数字是偶是奇,Lcm指目前计算出的最小公倍数 int main() { while(~scanf("%d%d",&n,&m)) { cnt=0; int x; while(m--) { scanf("%d",&x); if(x!=0)//除去0的那种情况 a[cnt++]=x; } ans=0; for(int i=0;i<cnt;i++) dfs(i,1,1); //容斥,奇加偶减 printf("%lld\n",ans); } return 0; }
相关文章推荐
- HDU 1796 How many integers can you find(容斥原理)
- HDU 1796 How many integers can you find (容斥原理 入门)
- [容斥原理] hdu 1796 How many integers can you find
- 【HDU】1796 - How many integers can you find(容斥原理,GCD)
- HDU 1796:How many integers can you find(容斥原理)
- [hdu 1796 How many integers can you find]容斥原理模板
- [ACM] HDU 1796 How many integers can you find (容斥原理)
- hdu-1796 How many integers can you find(容斥原理)
- hdu1796--How many integers can you find(容斥原理)
- [HDU 1796]How many integers can you find:容斥原理
- HDU 1796 How many integers can you find 容斥原理
- 【容斥原理】HDU-1796-How many integers can you find
- HDU 1796 How many integers can you find(组合数学-容斥原理)
- hdu 1796 How many integers can you find 容斥原理
- hdu 1796 How many integers can you find(容斥原理)
- hdu 1796 How many integers can you find(容斥原理)
- HDU 1796 How many integers can you find(组合数学-容斥原理)
- Hdu 1796 How many integers can you find (容斥原理 递归及循环的一般写法)
- HDU 1796 How many integers can you find(容斥原理)
- HDU 1796 How many integers can you find(容斥原理)