/*
遇到这种题一般用dfs,枚举起点来做
但是本题如何进行容斥?
比如以x为起点,第一步dfs到y,那么因子有lcm(x,y)的 所有数要被减掉(容斥中偶数是减法) 
然后第二步dfs到z,那么因子有lcm(x,y,z)的所有数要加上(容斥) 
*/ 
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define INF 1<<31
ll n,m,p[30],ans;

void dfs(int pos,ll LCM,ll cnt){
    if(p[pos]==0)return;
    ll d=__gcd(LCM,p[pos]);
    LCM=LCM*p[pos]/d;//求出新的lcm 
    if(cnt%2)ans+=(n-1)/LCM;//容斥,注意是<n 
    else ans-=(n-1)/LCM;
    for(int i=pos+1;i<=m;i++)dfs(i,LCM,cnt+1);
}

int main(){
    while(cin>>n>>m){
        ans=0;
         for(int i=1;i<=m;i++)cin>>p[i];
         for(int i=1;i<=m;i++)dfs(i,p[i],1); 
        cout<<ans<<endl;
    }
}
 

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。