蒟蒻求调
查看原帖
蒟蒻求调
648933
HarmonicQuadrilatera楼主2023/7/4 09:35

方法和题解一样,使用手写 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;
}
2023/7/4 09:35
加载中...