QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#828599 | #4283. Power of XOR | Rong7 | ML | 0ms | 0kb | C++17 | 3.2kb | 2024-12-23 18:34:06 | 2024-12-23 18:34:07 |
Judging History
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][22];
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;
}
详细
Test #1:
score: 0
Memory Limit Exceeded
input:
3 2 1 2 3
output:
12