How many integers can you find
Time Limit: 12000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 7439 Accepted Submission(s): 2200
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
2008 “Insigma International Cup” Zhejiang Collegiate Programming Contest - Warm Up(4)
题意:给你m个数 可能含有0 问有多少小于n的正数能整除这个m个数中的某一个
题解:特判除零 容斥原理 这m个数 组合时不能直接相乘 应当取最小公倍数
1 /****************************** 2 code by drizzle 3 blog: www.cnblogs.com/hsd-/ 4 ^ ^ ^ ^ 5 O O 6 ******************************/ 7 #include<bits/stdc++.h> 8 #include<map> 9 #include<set> 10 #include<cmath> 11 #include<queue> 12 #include<bitset> 13 #include<math.h> 14 #include<vector> 15 #include<string> 16 #include<stdio.h> 17 #include<cstring> 18 #include<iostream> 19 #include<algorithm> 20 #pragma comment(linker, "/STACK:102400000,102400000") 21 using namespace std; 22 #define A first 23 #define B second 24 const int mod=1000000007; 25 const int MOD1=1000000007; 26 const int MOD2=1000000009; 27 const double EPS=0.00000001; 28 typedef __int64 ll; 29 const ll MOD=1000000007; 30 const int INF=1000000010; 31 const ll MAX=1ll<<55; 32 const double eps=1e-8; 33 const double inf=~0u>>1; 34 const double pi=acos(-1.0); 35 typedef double db; 36 typedef unsigned int uint; 37 typedef unsigned long long ull; 38 ll gcd(ll aa,ll bb) 39 { 40 if(bb==0) 41 return aa; 42 else 43 return gcd(bb,aa%bb); 44 } 45 ll lcm(ll aa,ll bb) 46 { 47 return aa*bb/gcd(aa,bb); 48 } 49 ll n,m; 50 ll que[15]; 51 ll a[10000]; 52 ll ggg; 53 ll coun; 54 ll slove(ll gg) 55 { 56 ll t=0,sum=0; 57 a[t++]=-1; 58 for(ll i=0;i<coun;i++) 59 { 60 61 ll k=t; 62 for(ll j=0;j<k;j++) 63 { 64 a[t++]=que[i]*a[j]*(-1); 65 if(a[t-1]>0) 66 a[t-1]=lcm(que[i],-a[j]); 67 else 68 a[t-1]=0-lcm(que[i],a[j]); 69 } 70 } 71 for(ll i=1;i<t;i++) 72 sum=sum+(gg/a[i]); 73 return sum; 74 } 75 int main() 76 { 77 while(scanf("%I64d %I64d",&n,&m)!=EOF) 78 { 79 memset(que,0,sizeof(que)); 80 memset(a,0,sizeof(a)); 81 coun=0; 82 for(ll i=0;i<m;i++) 83 { 84 scanf("%I64d",&ggg); 85 if(ggg!=0) 86 que[coun++]=ggg; 87 } 88 printf("%I64d\n",slove(n-1)); 89 } 90 return 0; 91 }