B - How many integers can you find

Posted zjydeoneday

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了B - How many integers can you find相关的知识,希望对你有一定的参考价值。

  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.

题目大意:给你一个数n,和m个0~20的整数i,让你求1~n-1中是i的倍数的数有几个。

显然,这是一个容斥定理的题,求对1~(n-1)中所有m个i的倍数的数的个数。并且m<=10,因此我们用二进制枚举法就能够列出所有的情况。

需要注意的就是m个数,把这m个数先化成互质的。最后在套用模板即可。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
ll a[500];
int main()

    ll n, m;
    while(~scanf("%lld%lld",&n,&m))
    
        
        int top = 0;
        for(int i = 0; i < m; ++ i)
        
            ll x;
            cin >> x;
            if(x != 0)                  
                a[top++] = x;
        
        ll ans = 0,sum,num;
        for(int i = 1; i < (1 << top); ++ i)
        
            num=0,sum=1;
            for(int j = 0; j < top; ++ j)
            
                if((i >> j) & 1)
                
                    num++;
                    sum = sum * a[j] /(__gcd(sum, a[j]));
                
            
            if(num % 2)
            
                ans += (n - 1) / sum;   
            
            else
            
                ans -= (n - 1) / sum;
            
        
        cout << ans << endl;
    
    return 0;

以上。

以上是关于B - 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)