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.
容斥原理裸题
1 #include<stdio.h>
2 #include<string.h>
3 #include<algorithm>
4 #include<math.h>
5 using namespace std;
6 typedef long long ll;
7
8 inline int gcd(int a,int b){
9 return b?gcd(b,a%b):a;
10 }
11
12 int num[15];
13
14 int main(){
15 int n,m;
16 while(scanf("%d%d",&n,&m)!=EOF){
17 n--;
18 for(int i=1;i<=m;++i){
19 scanf("%d",&num[i]);
20 if(!num[i]){
21 i--;
22 m--;
23 }
24 }
25 ll ans=0;
26 for(int i=1;i<(1<<m);++i){
27 int bit=0;
28 int tmp=1;
29 for(int j=1;j<=m;++j){
30 if(i&(1<<(j-1))){
31 bit++;
32 tmp=tmp/gcd(tmp,num[j])*num[j];
33 }
34 }
35 if(bit%2)ans+=n/tmp;
36 else ans-=n/tmp;
37 }
38 printf("%lld
",ans);
39 }
40 return 0;
41 }