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+容斥)

HDU 1796 How many integers can you find (容斥)

HDU-1796 How many integers can you find(组合数学dfs)