HDU 1796 How many integers can you find(组合数学-容斥原理)
2014-08-03 12:31
489 查看
How many integers can you find
Problem DescriptionNow 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
Author
wangye
Source
2008
“Insigma International Cup” Zhejiang Collegiate Programming Contest - Warm Up(4)
Recommend
wangye
题目大意:
输入N,和M个数,求出1~N-1中,有几个数能被M个数任意一个整除。
解题思路:
利用容斥原理。被任意一个整除的个数 = 同时被一个整除 - 同时被两个整除 + 同时被三个整除 - ...
A∪B∪C = A+B+C - A∩B - B∩C - C∩A +A∩B∩C
区间[1,N]中能同时被x1, x2, ..., xm整除的数的个数 = N / lcm(x1, x2, ..., xm)
可以用位运算,简化枚举状态的过程。
参考代码:
#include <iostream> #include <vector> using namespace std; vector<int> a; int n, m; long long ans; long long gcd(long long x, long long y) { return y > 0 ? gcd(y, x % y) : x; } long long lcm(long long x, long long y) { return x * y / gcd(x, y); } void init() { a.clear(); ans = 0; } void input() { for (int i = 0; i < m; i++) { int x; cin >> x; if (x > 0) { a.push_back(x); } } m = a.size(); } void work() { for (int i = 1; i < (1 << m); i++) { long long x = 1; int cnt = 0; for (int j = 0; j < m; j++) { if (i & (1 << j)) { cnt++; x = lcm(x, a[j]); } } if (cnt & 1) { ans += (n - 1) / x; } else { ans -= (n - 1) / x; } } } void output() { cout << ans << endl; } int main() { ios::sync_with_stdio(false); while (cin >> n >> m) { init(); input(); work(); output(); } 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(组合数学:容斥定理+dfs)
- 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
- 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(容斥原理)
- soj 3137 Simple Computing 容斥原理 hdu 1796 How many integers can you find