zoukankan      html  css  js  c++  java
  • hdu 1796 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
     
    Author
    wangye
     
    Source
    思路:最简单的容斥,注意下可能输入0;奇加偶减
       比如12 2 
                  2   3
         ans=11/2+11/3-11/6;
    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<string>
    #include<queue>
    #include<algorithm>
    #include<stack>
    #include<cstring>
    #include<vector>
    #include<list>
    #include<set>
    #include<map>
    using namespace std;
    #define ll __int64
    #define mod 1000000007
    #define inf 999999999
    //#pragma comment(linker, "/STACK:102400000,102400000")
    int scan()
    {
        int res = 0 , ch ;
        while( !( ( ch = getchar() ) >= '0' && ch <= '9' ) )
        {
            if( ch == EOF ) return 1 << 30 ;
        }
        res = ch - '0' ;
        while( ( ch = getchar() ) >= '0' && ch <= '9' )
            res = res * 10 + ( ch - '0' ) ;
        return res ;
    }
    ll a[110];
    ll ji;
    ll ans,x,y;
    ll gcd(ll x,ll y)
    {
        return y==0?x:gcd(y,x%y);
    }
    void dfs(ll lcm,ll pos,ll step)
    {
        if(lcm>x)
        return;
        if(pos==ji)
        {
            if(step==0)
                return;
            if(step&1)
            ans+=x/lcm;
            else
            ans-=x/lcm;
            return;
        }
        dfs(lcm,pos+1,step);
        dfs(lcm/gcd(a[pos],lcm)*a[pos],pos+1,step+1);
    }
    int main()
    {
        ll z,i,t;
        while(~scanf("%I64d%I64d",&x,&y))
        {
            x--;
            ji=0;
            for(i=0;i<y;i++)
            {
                scanf("%I64d",&z);
                if(z==0)continue;
                a[ji++]=z;
            }
            ans=0;
            dfs(1,0,0);
            printf("%I64d
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    第一次冲刺02
    第一次冲刺01
    Android源码分析(十四)PackageManagerService服务分析
    Android源码分析(十三)ActivityManagerService服务分析
    Android源码分析(十二)ServiceManager服务分析
    Serializable和Parcelable之序列化
    ViewPager 相关使用
    AIDL介绍以及简单使用
    Android 四大组件 (五) 第五大组件
    Android 源码分析(十一) 事件传递机制
  • 原文地址:https://www.cnblogs.com/jhz033/p/5479946.html
Copyright © 2011-2022 走看看