矩快 10pts求调, 悬 2 关
查看原帖
矩快 10pts求调, 悬 2 关
617130
Yorg楼主2024/12/20 21:24
#include <bits/stdc++.h>
#define int long long
const int MAXN = 120;
const int N = 100;
const int MOD = 2;

int n, m, q;

int add(int a, int b) { return (a + b > MOD) ? a + b - MOD : a + b; }
int mul(int a, int b) { return (a * b * 1ll) % MOD; }
int dec(int a, int b) { return (a - b < 0) ? a - b + MOD : a - b; }
void pluson(int& a, int b) { a = add(a, b); }

struct matrix {
    int M[MAXN][MAXN];
    void clear() {
        memset(M, 0, sizeof M);
    }
    void reset() {
        clear();
        for (int i = 1; i <= N; i++) M[i][i] = 1;
    }
} ;
matrix operator * (const matrix& a, const matrix& b) {
    matrix ans;
    ans.clear();
    for (int i = 1; i <= n; i++)
        for (int k = 1; k <= n; k++) 
            for (int j = 1; j <= n; j++) 
                pluson(ans.M[i][j], mul(a.M[i][k], b.M[k][j]));
    return ans;
}
matrix quickpow(matrix p, int c) {
    matrix ans;
    ans.reset();
    while (c) {
        if (c & 1) ans = ans * p;
        p = p * p;
        c >>= 1;
    }
    return ans;
}
matrix f, base;
matrix pows[33]; // 幂次幂 base
/*预处理 2^k*/
void init()
{
    pows[0] = base;
    for (int i = 1; i <= 32; i++) {
        pows[i] = pows[i - 1] * pows[i - 1];
    }
}

signed main()
{
    freopen("P6569_2.in", "r", stdin);
    freopen("my.out", "w", stdout);
    scanf("%lld %lld %lld", &n, &m, &q);
    f.clear(), base.clear();
    for (int i = 1; i <= n; i++) {
        int now;
        scanf("%lld", &f.M[i][1]);
    }
    for (int i = 1; i <= m; i++) {
        int u, v; scanf("%lld %lld", &u, &v);
        base.M[u][v] = 1, base.M[v][u] = 1;
    }

    init();

    for (int i = 1; i <= q; i++) {
        int nowc; scanf("%lld", &nowc);
        matrix nowp; nowp.reset();
        for (int j = 32; j >= 0; j--) {
            if ((nowc >> j) & 1) {
                nowp = nowp * pows[j];
            }
        }
        int ans = 0, fnow = 1;
        for (int k = 1; k <= n; k++) {
            ans ^= f.M[k][1] * nowp.M[1][k];
        }
        
        printf("%lld\n", ans);
    }

    return 0;
}
2024/12/20 21:24
加载中...