试了极限数据也没问题,80分不知道怎么错的,下不了数据了,请求第13个点数据,下面是本蒟蒻的80分代码,可能写得不太正常,请见谅
#include<bits/stdc++.h>
using namespace std;
unsigned long long read()
{
unsigned long long x=0;
char ch=getchar();
while(ch<'0'||ch>'9')
{
//if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=(x<<1)+(x<<3)+ch-'0';
ch=getchar();
}
return x;
}
unsigned long long ksm(unsigned long long x,unsigned long long y)
{
unsigned long long sum=1;
while(y)
{
if(y&1) sum=sum*x;
x=x*x;
y>>=1;
}
return sum;
}
unsigned long long n,m,c,k,p,q;
unsigned long long a[1000006],cnt;
bool vis[65],used[65],flag;
unsigned long long ans;
string s;
int main()
{
//freopen("zoo.in","r",stdin);
//freopen("zoo.out","w",stdout);
s="18446744073709551616";
n=read();
m=read();
c=read();
k=read();
for(int i=1;i<=n;i++)
{
a[i]=read();
for(int j=0;j<k;j++)
{
if(a[i]&(unsigned long long)(1<<j)) vis[j]=1;
}
}
while(m--)
{
p=read();
q=read();
used[p]=1;
//if(!vis[p]) cnt++;
}
for(int i=0;i<k;i++) if(used[i]&&!vis[i]) cnt++;
if(k-cnt==64)
{
// cout<<s<<endl;
// return 0;
flag=1;
ans=ksm(2,63);
}
else ans=ksm(2,k-cnt);
for(int i=1;i<=n;i++)
{
for(int j=0;j<k;j++)
{
if(a[i]==0)
{
ans--;
break;
}
if(used[j]&&!vis[j]) continue;
if(a[i]&(unsigned long long)(1<<j))
{
ans--;
break;
}
}
}
if(flag&&ans==ksm(2,63)) cout<<s<<endl;
else printf("%llu\n",ans);
return 0;
}