hdu1796 How many integers can you find (容斥原理)
来源:互联网 发布:plc编程线 编辑:程序博客网 时间:2024/05/16 08:48
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 22 3
Sample Output
7
Author
wangye
题意:
问有多少个小于n的数能被集合里的数整除。集合拥有m个元素。
自己写的DFS容斥, 写得很粗糙, 在求最大公因数的时候没有用long long ,爆了int, 无情wa,于是破罐子破摔把所有的int都改成 long long就过了。后面附上大神代码, 十分精简
#include<iostream>#include<cstdio>#include<algorithm>#define ll long longusing namespace std;int n, m, num[15];long long sum, gg;int cmp(int k1, int k2) { int a = max(k1, k2); int b = min(k1, k2); if(b == 0) return a;int temp; while(b != 0) { temp = a % b; a = b; b = temp; } return (1LL * k1 * k2) / a ; } ll ans(int x){if(x == 0) return 0;ll te = n / x, mod = n % x;if(mod == 0) return te - 1; return te;} void DFS(int po, int te, int n, int co){ int cc = te;if(n == co){ //cout<<ans(te)<<endl; gg +=ans(te); // cout<<"te="<<te<<endl; //cout<<gg<<endl; } for(int i = 1; (po + i) < m; i++){ te = cmp(cc,num[po + i]);DFS(po + i, te, n + 1, co);} } int main(){while(scanf("%d", &n) != EOF){ scanf("%d", &m);for(int i = 0; i < m; i++){scanf("%d", num + i);if(num[i] == 0){ i--; m--;}} sum = 0; int f = -1;for(int co = 1; co <= m; co++) { f *= -1; for(int i = 0; i < m; i++){ gg = 0; DFS(i, num[i], 1, co); sum+= f * gg; }} cout<<sum<<endl; }return 0;}
附上大神代码
#include<iostream>#include<cstdio>#include<algorithm>#define ll long longusing namespace std;ll ans;int n, m, num[15];int gcd(ll a, ll b){return b == 0 ? a : gcd(b, a % b);} void DFS(int cur, ll lcm, int vis){ lcm = num[cur] / gcd( num[cur], lcm) * lcm; if(vis % 2) ans += (n - 1) / lcm; else ans -= (n - 1) / lcm; for(int i = cur + 1; i < m; i++) DFS(i, lcm, vis + 1);}int main(){while(scanf("%d%d", &n, &m) != EOF){for(int i = 0; i < m; i++){scanf("%d", num + i);if(num[i] == 0) i-- , m--; }ans = 0;for(int i = 0; i < m ; i++){DFS(i, num[i], 1);}cout<<ans<<endl;} 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
- 今天遇到chrome 浏览器 Cross origin requests are only supported for protocol schemes
- 集合框架
- 生鲜电商APP
- MongoDB索引管理-索引的创建、查看、删除
- chrome 谷歌浏览器怎么添加Axure扩展
- hdu1796 How many integers can you find (容斥原理)
- 自学AI
- Java-NIO(五):通道(Channel)的数据传输与内存映射文件
- 微软操作系统 Windows Server 2012 R2 官方原版
- nodejs 后台运行
- [mysql]CentOS7系统yum安装与配置mysql5.7
- android WebView js交互
- Algorithm之路十七:Letter Combinations of a Phone Number
- Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系