第一发略坑
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
__int64 n,m,ans,sum,a[20],b;
__int64 lcm(__int64 a,__int64 b)
{
int a1 = a,b1 = b;
while(b){
long long c = b;
b = a%b;
a = c;
}
return a1/a*b1/a*a;
}
void dfs(long long pre,long long am,long all,long pre2)
{
if(am==all)
{
long long g = 1,re=1;
for(int i=0;i<m;i++)
{
if(((1<<i)&pre))
g = lcm(g,a[i]);
if(g>=n)return;
}
if(all%2){ans+=(n-1)/g;}
else {ans-=(n-1)/g;}
}
else
{
for(int i=pre2;i<m;i++)
if(!((1<<i)&pre)){
dfs(pre|(1<<i),am+1,all,i+1);
}
}
}
int main()
{
while(scanf("%I64d%I64d",&n,&m)!=EOF)
{
int i1 = 0;
for(int i=0;i<m;i++)
{
scanf("%I64d",&b);
if(b>0&&b<n){
a[i1] = b;
i1++;
}
}
m = i1;
sort(a,a+m);
ans = 0;
for(int i=1;i<=m;i++)
dfs(0,0,i,0);
printf("%I64d\n",ans);
}
return 0;
}