题目描述
给出n , m,和m个数a[1]⋯a[m]。
求1⋯n中不被a[1]⋯a[m]中任意一个整除的数的个数。
10⩽n< 2^{31} ,1⩽m⩽15
输入格式
每组数据以n,m为第一行。
第二行m个数,表示a[i]。
输入文件以EOF结尾。
输出格式
每组数据一行一个数字表示答案。
样例输入
10 2
2 3
20 2
2 4
样例输出
3
10
#include <iostream>
#include <cstdlib>
#include <cstdio>
using namespace std;
long long gcd( long long a, long long b )
{
return (!b)?a:gcd( b, a%b );
}
long long lcm( long long a, long long b )
{
return a/gcd( a, b )*b;
}
int number[16];
int main()
{
int n,m;
while ( cin >> n >> m ) {
for ( int i = 0 ; i < m ; ++ i )
cin >> number[i];
int e = 1<<m,ans = n,bits;
for ( int i = 1 ; i < e ; ++ i ) {
long long l = 1LL;
bits = 0;
for ( int j = 0 ; j < m ; ++ j )
if ( i&(1<<j) ) {
l = lcm( l, number[j] );
bits ++;
}
if ( bits&1 )
ans -= n/l;
else ans += n/l;
}
printf("%d\n",ans);
}
return 0;
}