方法和题解一样,使用手写 bitset,wa 在了 11 个点……
#include<bits/stdc++.h>
#define ull unsigned long long
#define I(x) ((((x)-1)>>6)+1)
#define B(x) (1ull<<(((x)-1)&63))
using namespace std;
struct bs{
ull a[20000005],tmp[69];
int n,bn;
inline void init(int x){n=x;bn=((n-1)>>6)+1;}
inline void addsmall(int x)
{
memset(tmp,0,sizeof(tmp));
for(int i=1;i<=64;i++)
tmp[I(x*i)]|=B(x*i);
for(int i=1,j=1;i<=bn;i++,j++)
{
a[i]|=tmp[j];
if(j==x) j=0;
}
}
inline void addbig(int x)
{for(int i=x;i<=n;i+=x) a[I(i)]|=B(i);}
};
int n,m,s,ans;
bs a;
inline int cnt(ull x)
{int res=0;while(x)res++,x-=x&-x;return res;}
int main()
{
cin>>n>>m;
a.init(n);
while(m--)
{
scanf("%d",&s);
if(s<=64) a.addsmall(s);
else a.addbig(s);
}
// for(int i=1;i<=n;i++) putchar((bool)(a.a[I(i)]&B(i))+'0');
for(int i=1;i<a.bn;i++) ans+=cnt(a.a[i]&(a.a[i]>>1)&(a.a[i]>>2));
for(int i=1;i<a.bn;i++)
ans+=(a.a[i]&(1ull<<62))&&(a.a[i]&(1ull<<63))&&(a.a[i+1]&1),
ans+=(a.a[i+1]&2)&&(a.a[i]&(1ull<<63))&&(a.a[i+1]&1);
for(int i=0;i<=(n&63)-2;i++)
if((a.a[a.bn]&(1<<i))&&(a.a[a.bn]&(1<<(i+1)))&&(a.a[a.bn]&(1<<(i+2)))) ans++;
cout<<ans;
return 0;
}