为什么会wa
查看原帖
为什么会wa
111475
doctorZ_楼主2022/4/30 16:24
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
void read(int &res)
{
	res=0;char ch=getchar();
	while(ch<'0'||ch>'9') ch=getchar();
	while('0'<=ch&&ch<='9') res=(res<<1)+(res<<3)+(ch^48),ch=getchar();
}
const int N=1e6+10,M=2010,B=14,full=16384+10,L=310;
const ll mod=998244353;
int n,m,prime[M+10],a[N+10],id[M+10],p[M+10],c[L+10][full+10],d[M+10];
ll f[full+10],Pow[N+10];
ll ksm(ll a,ll b)
{
	if(b==0) return 1;
	ll tmp=ksm(a,b>>1);
	if(b&1) return tmp*tmp%mod*a%mod;
	else return tmp*tmp%mod;
}
void Add(ll &a,ll b){a+=b;if(a>=mod) a-=mod;}
bool vis[M+10];
void init()
{
	for(int i=2;i<=M;i++)
	{
		if(!vis[i]) prime[++prime[0]]=i,id[i]=prime[0];
		for(int j=1;j<=prime[0]&&i*prime[j]<=M;j++)
		{
			vis[i*prime[j]]=true;
			if(i%prime[j]==0) break;
		}
	}
	for(int i=1;i<=B;i++)
		for(int j=prime[i];j<=M;j+=prime[i])
			p[j]|=(1<<i-1);
}
int main()
{
	init();
	read(n);
	ll inv2=ksm(2ll,mod-2);
	Pow[0]=1;for(int i=1;i<=n;i++) Pow[i]=Pow[i-1]*inv2%mod;
	ll res=ksm(Pow[n],mod-2);
	for(int i=1,x;i<=n;i++) read(x),d[x]++;
	for(int i=1;i<=prime[0];i++)
		for(int s=0;s<=full;s++)
			for(int k=prime[i];k<=M;k+=prime[i])
				if(!(p[k]&s))
					c[i][s]+=d[k];
	read(m);
	for(int l;m--;)
	{
		read(l);
		f[0]=1;for(int s=1;s<=full;s++) f[s]=0;
		for(int i=1;i<=l;i++) read(a[i]);
		sort(a+1,a+1+l);
		for(int i=1,x;i<=l;i++)
		{
			x=a[i],x=id[x];
			for(int s=full;s>=0;s--)
			{
				if(!f[s]) continue;
				if(x<=B) Add(f[s|(1<<x-1)],mod-f[s]*Pow[c[x][s]]%mod);
				else Add(f[s],mod-f[s]*Pow[c[x][s]]%mod);
			}
		}
		ll ans=0;
		for(int s=0;s<=full;s++) Add(ans,f[s]);
		printf("%lld\n",ans*res%mod);
	}
	return 0;
}

如果把给a数组排序那一行注释掉就会wa,我感觉这并没有什么关键作用

2022/4/30 16:24
加载中...