QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#828598#4283. Power of XORRong7ML 0ms0kbC++173.2kb2024-12-23 18:33:392024-12-23 18:33:43

Judging History

This is the latest submission verdict.

  • [2024-12-23 18:33:43]
  • Judged
  • Verdict: ML
  • Time: 0ms
  • Memory: 0kb
  • [2024-12-23 18:33:39]
  • Submitted

answer

// Go in my style.
// Not afraid to dark.

#include <bits/stdc++.h>
using namespace std;

clock_t sttime;
#define STCLOCK sttime = clock ();
#define TIMENOW fprintf (stderr, "\nNOW TIME COSSEMED: %0.4lf\n", 1.0 * (clock () - sttime) / CLOCKS_PER_SEC);
#define inline __inline__ __attribute__ ((always_inline))

#define int long long

namespace io {
    int read_pos, read_dt; char read_char;
    inline int read (int &p = read_pos){
        p = 0, read_dt = 1; read_char = getchar ();
        while (! isdigit (read_char)){
            if (read_char == '-')
                read_dt = - 1;
            read_char = getchar ();
        }
        while (isdigit (read_char)){
            p = (p << 1) + (p << 3) + read_char - 48;
            read_char = getchar ();
        }
        return p = p * read_dt;
    }
    int write_sta[65], write_top;
    inline void write (int x){
        if (x < 0)
            putchar ('-'), x = - x;
        write_top = 0;
        do
            write_sta[write_top ++] = x % 10, x /= 10;
        while (x);
        while (write_top)
            putchar (write_sta[-- write_top] + 48);
    }
}

#define ful(t) ((1ll << (t)) - 1)
const int N = 44, mod = 1e9 + 7;
int n, m, ts[N + 5], cnt;
int f[2][1 << 21][25];

struct LINE {
    int b[N + 5];
    inline bool insert (int x){
        for (int i = N;i >= 0;-- i)
            if (x >> i & 1){
                if (b[i]) x ^= b[i];
                else {
                    b[i] = x;
                    return true;
                }
            }
        return false;
    }
    inline void sol (){
        f[0][0][b[0]] = f[0][0][0] = 1;
        f[0][1][b[0] ^ 1] = f[0][1][1] = 1;
        for (int i = 1, u = 1, v = 0;i <= 20;++ i, u ^= 1, v ^= 1)
            for (int j = 0;j < (1 << (i + 1));++ j)
                for (int k = 0;k <= i + 1;++ k){
                    #define upd(w) k - ((w) >> i & 1) >= 0 ? f[u][j][k] += f[v][(w) & ful (i)][k - ((w) >> i & 1)] : 0
                    f[u][j][k] = 0;
                    upd (j); 
                    if (b[i]) upd (j ^ b[i]);
                }
        vector < int > bs;
        for (int i = 21;i <= N;++ i)
            if (b[i]) bs.push_back (i);
        for (int s = 0;s < (1 << (int) bs.size ());++ s){
            int w = 0, c = 0;
            for (int i = 0;i < (int) bs.size ();++ i)
                if (s >> i & 1) w ^= b[bs[i]];
            c = __builtin_popcountll (w >> 21);
            for (int i = c;i <= c + 21;++ i)
                ts[i] += f[0][w & ful (21)][i - c];
        }
        // for (int i = 0;i <= N;++ i) printf ("%lld\n", ts[i]);
    }
} l;

inline int power (int a, int p){
    static int res; res = 1;
    while (p > 0){
        if (p & 1) res = res * a % mod;
        a = a * a % mod;
        p >>= 1;
    }
    return res;
}

signed main (){
    STCLOCK

    io::read (n), io::read (m);
    for (int i = 1;i <= n;++ i) cnt += ! l.insert (io::read ());
    l.sol ();
    int ans = 0;
    for (int i = 1;i <= N;++ i) ans = (ans + ts[i] % mod * power (i, m)) % mod;
    ans = ans * power (2, cnt) % mod;
    io::write (ans), putchar ('\n');

    TIMENOW
    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 0
Memory Limit Exceeded

input:

3 2
1 2 3

output:

12

result: