How many integers can you find
Problem description now you get a number N, and a m-integers set, you shocould 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 22 3
Sample output
7
Authorwangye
Source2008 "insigma International Cup" Zhejiang Collegiate Programming Contest-warm up (4)
Recommendwangye | we have carefully selected several similar problems for you: 1793 1794 1797 1795
Question:
Give you 1 number N, then give m number, ask you 1 ~ The number of n-1 values can be divisible by any number of M values.
Solution:
We can solve this problem by using the principle of rejection.
Solution code:
#include <iostream>#include <cstdio>#include <vector>using namespace std;typedef long long ll;int n,m,a[20];ll gcd(ll a,ll b){ return b>0 ? gcd(b,a%b):a;}int main(){ while(scanf("%d%d",&n,&m)!=EOF){ int ans=0; vector <int> v; for(int i=0;i<m;i++){ scanf("%d",&a[i]); if(a[i]>0) v.push_back(a[i]); } m=v.size(); for(int i=1;i<(1<<m);i++){ int cnt=0; ll x=1; for(int t=0;t<m;t++){ if(i&(1<<t)){ cnt++; x=x*v[t]/gcd(x,v[t]); } } if( cnt&1 ) ans+=(n-1)/x; else ans-=(n-1)/x; } cout<<ans<<endl; } return 0;}