How many integers can you find
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
题意:
给你m个数的集合,给你一个n问你小于n并且是这m个数里面的数的倍数有多少
题解:
dfs容斥原理
奇数偶数加减法
#include<bits/stdc++.h> using namespace std; const int N = 3e6+20, M = 1e6+10, mod = 1e9+7,inf = 1e9+1; typedef long long ll; ll ans; int x,a[N],n,m; ll gcd(ll a,ll b) {return b==0?a:gcd(b,a%b);} void dfs(int i,int num,ll tmp) { if(i>=m) { if(num==0) ans=0; else { if(num&1) ans = (ans+n/tmp); else ans = ans - n/tmp; } return ; } dfs(i+1,num,tmp); dfs(i+1,num+1,tmp*a[i]/gcd(tmp,a[i])); } int main() { while(scanf("%d%d",&n,&m)!=EOF) { int k = 0; n--; for(int i=1;i<=m;i++) { scanf("%d",&x); if(x) a[k++] = x; } m = k; ans = 0; dfs(0,0,1); printf("%I64d ",ans); } return 0; }