如题,写了三种算法拼接在一起,分别是暴力,完全图的特殊情况,快速幂
#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
#include<cstring>
using namespace std;
vector<int> b[101];
int n,m,q,val[201][201],ques[201],now=0,a1,a2,tot=1,mxsl;
struct Matrix
{
int n,m,a[201][201];
inline Matrix(int _n=0,int _m=0): n(_n),m(_m)
{
memset(a,0,sizeof a );
}
inline Matrix operator = (const Matrix &o)
{
n=o.n;
m=o.m;
memcpy(a,o.a,sizeof a );
return *this;
}
inline Matrix operator * (const Matrix &o) const
{
Matrix ans(n,o.m);
for(int i=0;i<=n-1;i++)
{
for(int k=0;k<=m-1;k++)
{
for(int j=0;j<=o.m-1;j++)
{
ans.a[i][j]^=a[i][k]*o.a[k][j];
}
}
}
return ans;
}
}F,M[32],ans;
void INIT()
{
F.n=n;
M[0].n=n;
M[0].m=n;
F.m=1;
}
void Work()
{
for(int i=1;i<=150;i++)
{
for(int j=1;j<=n;j++)
{
for(int k=0;k<b[j].size();k++)
{
val[j][i]^=val[b[j][k]][i-1];
}
}
}
if(n%2==1)
{
for(int i=1;i<=q;i++)
{
scanf("%d",&a1);
printf("%d\n",val[1][1]);
}
}
else
{
for(int i=1;i<=q;i++)
{
scanf("%d",&a1);
a1=a1%2;
printf("%d\n",val[1][a1]);
}
}
return;
}
void Round1()
{
for(int i=1;i<=150;i++)
{
for(int j=1;j<=n;j++)
{
for(int k=0;k<b[j].size();k++)
{
val[j][i]^=val[b[j][k]][i-1];
}
}
}
for(int i=1;i<=q;i++)
{
printf("%d\n",val[1][ques[i]]);
}
return;
}
void Round2()
{
for(int i=1;i<=31;i++)
{
M[i]=M[i-1]*M[i-1];
}
for(int i=1;i<=q;i++)
{
ans=F;
for(int bits=0;bits<=31;bits++)
{
if((ques[i]>>bits)&1)
{
ans=M[bits]*ans;
}
}
cout<<ans.a[0][0]<<endl;
}
}
int main()
{
//freopen("magic.in","r",stdin);
//freopen("magic.out","w",stdout);
scanf("%d%d%d",&n,&m,&q);
INIT();
for(int i=1;i<=n;i++)
{
scanf("%d",&val[i][0]);
F.a[i-1][0]=val[i][0];
}
for(int i=1;i<=m;i++)
{
scanf("%d%d",&a1,&a2);
b[a1].push_back(a2);
b[a2].push_back(a1);
a1--;
a2--;
M[0].a[a1][a2]=M[0].a[a2][a1]=1;
}
if(2*m==n*(n-1))
{
Work();
return 0;
}
for(int i=1;i<=q;i++)
{
scanf("%d",&ques[i]);
mxsl=max(mxsl,ques[i]);
}
if(mxsl<=150)
{
Round1();
return 0;
}
else
{
Round2();
return 0;
}
}