How many integers can you find
Posted mxzf0213
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了How many integers can you find相关的知识,希望对你有一定的参考价值。
How many integers can you find
Time Limit: 12000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
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
分析:容斥原理,注意long long;
代码:
#include <iostream> #include <cstdio> #include <cstdlib> #include <cmath> #include <algorithm> #include <climits> #include <cstring> #include <string> #include <set> #include <bitset> #include <map> #include <queue> #include <stack> #include <vector> #define rep(i,m,n) for(i=m;i<=n;i++) #define mod 1000000007 #define inf 0x3f3f3f3f #define vi vector<int> #define pb push_back #define mp make_pair #define fi first #define se second #define ll long long #define pi acos(-1.0) #define pii pair<int,int> #define sys system("pause") const int maxn=1e5+10; using namespace std; inline ll gcd(ll p,ll q){return q==0?p:gcd(q,p%q);} inline ll qpow(ll p,ll q){ll f=1;while(q){if(q&1)f=f*p;p=p*p;q>>=1;}return f;} inline void umax(ll &p,ll q){if(p<q)p=q;} inline void umin(ll &p,ll q){if(p>q)p=q;} inline ll read() { ll x=0;int f=1;char ch=getchar(); while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();} while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();} return x*f; } int n,m,k,t,fac[20],all; int main() { int i,j; while(~scanf("%d%d",&m,&n)) { --m; all=0; rep(i,0,n-1) { scanf("%d",&j); if(j)fac[all++]=j; } ll ret=0; rep(i,1,(1<<all)-1) { ll now=1,cnt=0; rep(j,0,all-1) { if(i&(1<<j)) { cnt++; now=now*fac[j]/gcd(now,fac[j]); } } if(cnt&1)ret+=m/now; else ret-=m/now; } printf("%lld\n",ret); } return 0; }
以上是关于How many integers can you find的主要内容,如果未能解决你的问题,请参考以下文章
HDU 1796 How many integers can you find
HDU 1796How many integers can you find(容斥原理)
hdu1796 How many integers can you find 容斥原理
HDOJ1796 How many integers can you find(dfs+容斥)