前言
暴了一堆分。
别问,问就是卡常。
卡常前的代码(20pts):
LL n, m, q, f[MAXN], a[MAXN];
bitset<MAXN> x[MAXN], y[MAXN];
struct Matrix
{
LL c[MAXN][MAXN];
Matrix(){for (Int i = 0; i < MAXN; ++ i) for (Int j = 0; j < MAXN; ++ j) c[i][j] = 0;}
friend Matrix operator * (const Matrix &Tx,const Matrix &Ty)
{
Matrix Res;
for (Int i = 0; i < MAXN; ++ i)
for (Int j = 0; j < MAXN; ++ j)
x[i][j] = Tx.c[i][j];
for (Int i = 0; i < MAXN; ++ i)
for (Int j = 0; j < MAXN; ++ j)
y[j][i] = Ty.c[i][j];
for (Int i = 0; i < MAXN; ++ i)
for (Int k = 0; k < MAXN; ++ k)
Res.c[i][k] = (x[i] & y[k]).count() % 2;
return Res;
}
}Fuck, Bz[32];
inline Matrix QuickPow_Matrix(Matrix x,LL y)
{
Matrix Res = x; y --;
while ( y )
{
if (y & 1)
Res = Res * x;
x = x * x;
y /= 2;
}
return Res;
}
int main()
{
read( n ); read( m ); read( q );
for (Int i = 0; i < n; ++ i)
read( f[i] );
for (Int i = 0; i < m; ++ i)
{
LL u, v;
read( u ); read( v );
u --, v --;
Fuck.c[u][v] = Fuck.c[v][u] = 1;
}
LL Cl = 0;
for (Int i = 0; i < q; ++ i)
{
read( a[i] );
Cl = Max(Cl, (LL)log2( a[i] ));
}
//printf("Cl_2 = %lld\n", Cl);
Bz[0] = Fuck;
for (Int i = 1; i <= Cl; ++ i)
Bz[i] = Bz[i - 1] * Bz[i - 1];
for (Int i = 0; i < q; ++ i)
{
Matrix Ans;
for (Int j = 0; j < n; ++ j)
Ans.c[j][j] = 1;
LL Mi = 0;
while ( a[i] )
{
if (a[i] % 2)
Ans = Ans * Bz[Mi];
Mi ++, a[i] /= 2;
}
LL Prin = 0;
for (Int i = 0; i < n; ++ i)
if (Ans.c[0][i])
Prin ^= f[i];
printf("%u\n", Prin);
卡常后:(就卡了个 1 2 \frac{1}{2} 21的常数,100pts)
#include <cmath>
#include <cstdio>
#include <bitset>
#define MAXN 100
#define LL unsigned int
#define Int register int
using namespace std;
inline void read(LL &x)
{
x = 0;
LL f = 1;
char s = getchar();
while (s < '0' || s > '9')
{
if (s == '-')
f = -1;
s = getchar();
}
while (s >= '0' && s <= '9')
{
x = (x << 3) + (x << 1) + (s ^ 48);
s = getchar();
}
x *= f;
}
inline LL Max(LL x,LL y)
{
return x > y ? x : y;
}
inline LL Min(LL x,LL y)
{
return x < y ? x : y;
}
LL n, m, q, f[MAXN], a[MAXN];
struct Matrix
{
bitset<MAXN> c[MAXN];
Matrix(){for (Int i = 0; i < MAXN; ++ i) c[i] = 0;}
friend Matrix operator * (const Matrix &Tx,const Matrix &Ty)
{
Matrix Res;
for (Int i = 0; i < MAXN; ++ i)
for (Int j = 0; j <= i; ++ j)
Res.c[i][j] = Res.c[j][i] = (Tx.c[i] & Ty.c[j]).count() % 2;
return Res;
}
}Fuck, Bz[33];
inline Matrix QuickPow_Matrix(Matrix x,LL y)
{
Matrix Res = x; y --;
while ( y )
{
if (y & 1)
Res = Res * x;
x = x * x;
y /= 2;
}
return Res;
}
int main()
{
read( n ); read( m ); read( q );
for (Int i = 0; i < n; ++ i)
read( f[i] );
for (Int i = 0; i < m; ++ i)
{
LL u, v;
read( u ); read( v );
u --, v --;
Fuck.c[u][v] = Fuck.c[v][u] = 1;
}
LL Cl = 0;
for (Int i = 0; i < q; ++ i)
{
read( a[i] );
Cl = Max(Cl, (LL)log2( a[i] ));
}
//printf("Cl_2 = %lld\n", Cl);
Bz[0] = Fuck;
for (Int i = 1; i <= Cl; ++ i)
Bz[i] = Bz[i - 1] * Bz[i - 1];
for (Int i = 0; i < q; ++ i)
{
Matrix Ans;
for (Int j = 0; j < n; ++ j)
Ans.c[j][j] = 1;
LL Mi = 0;
while ( a[i] )
{
if (a[i] % 2)
Ans = Ans * Bz[Mi];
Mi ++, a[i] /= 2;
}
LL Prin = 0;
for (Int i = 0; i < n; ++ i)
if (Ans.c[0][i])
Prin ^= f[i];
printf("%u\n", Prin);
}
return 0;
}