1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| #define mid ((l + r) / 2) #define lid p << 1, l, mid #define rid p << 1 | 1, mid + 1, r #define seg int p, int l, int r
int main() { ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); ll T; int n, m; cin >> n >> T >> m; V<mint> a(1 << (n + 1)), pw(n + 5, 1); For(i, 1, n) pw[i] = pw[i - 1] * 2; For(i, 0, m - 1) cin >> a[i]; For(i, m, (1 << n) - 1) a[i] = a[i - m] * 101 + 10007;
V<mint> f(n + 5); For(i, 0, n - 1) { For(j, 0, i) { mint A = pw[n - 1], B = pw[n - 1] * (n - 1 - j) + 1; mint s0 = (A + B).pow(T), s1 = (B - A).pow(T); if (j == i) f[i] += (s0 - s1) / pw[n - j]; else f[i] += (s1 + s0 - 2 * B.pow(T)) / pw[n - j]; } }
mint F0 = (pw[n - 1] * n + 1).pow(T); For(i, 0, n - 1) F0 -= f[i] * pw[n - 1 - i];
Vi cnt(1 << n); For(i, 0, (1 << n) - 1) { cnt[i] = (cnt[i >> 1] >> 1) | ((i & 1) << (n - 1)); if (i > cnt[i]) swap(a[i], a[cnt[i]]); } For(i, 0, (1 << n) - 1) swap(a[i], a[i + (1 << n)]);
auto dfs1 = [&](auto lf, seg, int D) -> mint { if (l == r) { mint res = a[p]; a[p] *= F0; return res; } mint L = lf(lf, lid, D + 1), R = lf(lf, rid, D + 1); a[p << 1] += R * f[D], a[p << 1 | 1] += L * f[D]; return L + R; }; dfs1(dfs1, 1, 0, (1 << n) - 1, 0);
int ans = 0; auto dfs = [&](auto lf, seg) -> void { if (l == r) { ans ^= a[p].d; return; } a[p << 1] += a[p], a[p << 1 | 1] += a[p]; lf(lf, lid), lf(lf, rid); }; dfs(dfs, 1, 0, (1 << n) - 1);
cout << ans << '\n'; }
|