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.
12 2 2 3
7
#include<cstdio>
#include<cmath>
#include<algorithm>
#define LL long long
using namespace std;
LL num[25];
LL n,m;
LL gcd(LL a,LL b)
{
int r;
while(b!=0)
{
r=b;
b=a%b;
a=r;
}
return a;
}
LL lcm(LL a,LL b)
{
return a/gcd(a,b)*b;
}
LL solve()
{
LL ans = 0;
for (LL i = 1 ; i <(1<<m) ; i++)
{
LL ant = 0;
LL k = 1;
for (LL j = 0 ; j < m; j++)
{
if (i & (1<<j))
{
ant++;
k=lcm(k,num[j]);//因为m集合内的数不一定是质数,所以当集合内数累乘时应求其最小公倍数。
}
}
if (ant & 1)
ans += n / k;
else
ans -= n / k;
}
return ans;
}
int main()
{
LL i;
while(~scanf("%lld %lld",&n,&m))
{
n=n-1;
for(i=0;i<m;i++)
{
scanf("%lld",&num[i]);
if(num[i]==0) //m集合内的数可能有0,将情况排除
{
i--;
m--;
}
}
sort(num,num+m);
printf ("%lld\n",solve());
}
return 0;
}