intmain() { int n; std::cin >> n >> m; for (int i = 1; i <= n; ++ i) { scanf("%lld", &x); for (int j = m - 1; ~j; -- j) { if (~x >> j & 1) continue; if (!a[j]) { a[j] = x; break; } x ^= a[j]; } } int sz = 0; for (int i = 0; i < m; ++ i) sz += !!a[i]; if (sz <= 26) { int t = 0; for (int i = 0; i < m; ++ i) if (a[i]) tmp[++ t] = a[i]; dfs(sz, 0); for (int i = 0; i <= m; ++ i) std::cout << (LL) cnt[i] * qpow(2, n - sz) % Mod << ' '; std::cout << '\n'; return0; } for (int i = C[0][0] = 1; i < N; ++ i) for (int j = C[i][0] = 1; j <= i; ++ j) upd(C[i][j] = C[i - 1][j - 1], C[i - 1][j]); for (int i = 0; i <= m; ++ i) for (int j = 0; j <= m; ++ j) for (int k = 0; k <= i && k <= j; ++ k) if (~k & 1) upd(f[i][j], (LL) C[i][k] * C[m - i][j - k] % Mod); elseupd(f[i][j], Mod - (LL) C[i][k] * C[m - i][j - k] % Mod); for (int i = m - 1; ~i; -- i) if (a[i]) for (int j = i + 1; j < m; ++ j) if (a[j] >> i & 1) a[j] ^= a[i]; for (int i = 0; i < m; ++ i) for (int j = 0; j < i; ++ j) { int x = a[i] >> j & 1, y = a[j] >> i & 1; if (x == y) continue; a[i] ^= (1LL << j), a[j] ^= (1LL << i); } int t = 0; for (int i = 0; i < m; ++ i) if (~a[i] >> i & 1) tmp[++ t] = a[i] | (1LL << i); dfs(t, 0); for (int i = 0; i <= m; ++ i) { int res = 0; for (int j = 0; j <= m; ++ j) upd(res, (LL) cnt[j] * f[j][i] % Mod * qpow(2, Mod - 1 + sz - m) % Mod); res = (LL) res * qpow(2, n - sz) % Mod; std::cout << res << ' '; } return0; }
Gitalking ...