[容斥原理] hdu 1796 How many integers can you find
Posted clnchanpin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[容斥原理] hdu 1796 How many integers can you find相关的知识,希望对你有一定的参考价值。
题意:
给一个N。然后给M个数,问1~N-1里面有多少个数能被这M个数中一个或多个数整除。
思路:
首先要N--
然后对于每一个数M 事实上1~N-1内能被其整除的 就是有(N-1)/M[i]个
可是会出现反复 比方 例子 6就会被反复算
这时候我们就须要容斥原理了
加上一个数的减去两个数的。。
这里要注意了 两个数以上的时候 是求LCM而不是简单的相乘!
代码:
#include "stdio.h" #include "string.h" #include "math.h" #include "iostream" #include "cstdlib" #include "algorithm" #include "queue" using namespace std; int a[12]; int used[12],b[12]; int n,m; int gcd(int a,int b) { return b==0?a:gcd(b,a%b); } int lcm(int k) { int ans=b[0]; for(int i=1;i<k;i++) { int tep=gcd(ans,b[i]); ans=ans/tep*b[i]; } return ans; } __int64 dfs(int kk,int x,int lit) { __int64 ans=0; if(x==lit) { int tep; tep=lcm(x); return n/tep; } for(int i=kk+1;i<m;i++) { if(a[i]==0) continue; if(used[i]) continue; used[i]=1; b[x]=a[i]; ans+=dfs(i,x+1,lit); used[i]=0; } return ans; } int main() { while(scanf("%d%d",&n,&m)!=-1) { n--; for(int i=0;i<m;i++) scanf("%d",&a[i]); __int64 ans=0; for(int i=1;i<=m;i++) { // printf("%d\n",dfs(-1,0,i)); memset(used,0,sizeof(used)); if(i%2==0) ans-=dfs(-1,0,i); else ans+=dfs(-1,0,i); } printf("%I64d\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(容斥原理+二进制/DFS)
[容斥原理] hdu 1796 How many integers can you find
HDU 1796 How many integers can you find