【清华集训2014】玛里苟斯
看到這道題,然后便錯誤地聯想到了數位DP什么的……接著發現了答案在一個界內,然后就想著暴力了。
首先如果對每一位都設一個變量的話,根據插板法,最多只能有1e7個項對答案有貢獻,和答案在一個界內這個條件組合起來,這啟發我們去想暴力。
首先非基變量是沒有用的,考慮它們的選和不選,最后都要除掉。
所以只有基變量有貢獻。
顯然基變量越多跑的越慢,這個時候設基變量有 \(b\) 個,很明顯可以得到答案的一個粗略的下界
\[ \frac{\sum_{i=0}^{2^{b-1}} i^k}{2^{b-1}} \]
首先上面是一個自然冪數前綴和,顯然是一個 \(k+1\) 項的多項式,忽略常數帶來的影響,除掉分母,令 \(x = 2^b\),可得
\[x ^ k \le 2^{63} \]
也就是說,$ b \leq \log_2 \sqrt[k]{2^{63}} $,易得 \(k \geq 3\) 的時候是可以暴力枚舉基的。
那么只剩下 \(k = 1\) 或 \(2\) 了。
考慮 \(k = 1\),只要按位考慮貢獻即可。
考慮 \(k = 2\),對于平方,只是同一種方案對每兩個位的值進行乘積后求和。所以需要同時考慮兩位。
因為單個變量 \(0\) 和 \(1\) 是相同的,所以考慮分別乘個 \(\frac{1}{2}\) 即可。
拆一下式子枚舉變量即可。注意 \(k = 2\) 時只有 \(\frac{1}{2}\) 的判定不是下標相同(雖然式子拆出來是這樣的),而是在基張成的線性空間里每個向量這兩位都相同。即基向量矩陣中這兩行相等。
計算過程可以用 __int128 所以沒什么問題,long double 會掉精度。
所以還是一道簡單題,但我還是爆OJ了。
#include <bits/stdc++.h>typedef unsigned long long LL; typedef __int128 H; LL lb[64], bss[64], mat[64]; int n, K, bak; void insert(LL v) {for (int i = 63; ~i; --i)if (v >> i & 1) {if (lb[i]) v ^= lb[i];else { lb[i] = v; break; }} } LL fnd(LL x) {LL res = 0;for (int i = 63; ~i; --i)if (lb[i] & x)res |= 1llu << i;return res; } H fastpow(H a, int px) {H res = 1;while (px --> 0) res *= a;return res; } H haans; void dfs(int now, LL v) {if (now == bak) {haans += fastpow(v, K);return ;}dfs(now + 1, v);dfs(now + 1, v ^ bss[now]); } int main() {std::ios_base::sync_with_stdio(false), std::cin.tie(0);std::cin >> n >> K;LL t;for (int i = 1; i <= n; ++i) std::cin >> t, insert(t);for (int i = 0; i < 64; ++i) if (lb[i]) bss[bak++] = lb[i];H ans = 0; LL app = 0;for (int i = 0; i != 64; ++i) app |= lb[i];if (K >= 3) dfs(0, 0), ans = haans >> bak - 1;else if (K == 2) {for (int i = 0; i != 64; ++i) mat[i] = fnd(1llu << i);for (int i = 0; i != 64; ++i) if (app >> i & 1)for (int j = 0; j != 64; ++j) if (app >> j & 1)ans += (H) (1llu << i) * (1llu << j) * (1 << (mat[i] == mat[j]));ans >>= 1;} else ans = app;LL ax = ans;std::cout << (ax >> 1);if (ax & 1) std::cout << ".5";std::cout << std::endl;return 0; }轉載于:https://www.cnblogs.com/daklqw/p/11515486.html
總結
以上是生活随笔為你收集整理的【清华集训2014】玛里苟斯的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 分销系统数据库设计
- 下一篇: 系统定制开发,微商来----专业做分销商