題意:給定n個整數,求滿足子集異或和為0的子集大小之和。
題解:相當於求每個數出現在子集中的次數之和。
先對n個數求線性基,設線性基大小為r,可以分別計算線性基內數的貢獻和線性基外數的貢獻
1.線性基外:共n-r個數,列舉每個數x,將線性基外剩餘的n-r-1個數任意排列,顯然共有 2^個集合,這些集合再異或x的結果還是能被線性基異或出,所以x的貢獻為 2^。
2.線性基內:列舉每個數x,將所有剩餘的n-1個數再求一次線性基,設為b,分兩種情況:
(1) x不能被b異或出。那麼顯然x不能在任意乙個集合**現,x的貢獻為0。
(2) x可以被b異或出。此時b的大小必定也為r,因為b已經能表示所有n個數了。那麼在除去x和b的情況下,剩餘n-r-1個數顯然也是任意排列,x貢獻為 2^。
copy的dicsh
#include using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
const int maxn = 100000 + 5;
const int mod = 1e9 + 7;
ll a[maxn];
vectorid;
struct linerbase
bool insert(ll x)
bool check(ll x)
return res;
}int main()
else b2.insert(a[i]);
}int r = b1.cnt;
if(r == n)
ll tp = qpow(2, n-r-1);
ll ans = (n-r) * tp % mod;
for(int i = 0; i < id.size(); i++)
if(b3.check(x)) ans = (ans + tp) % mod;
}printf("%lld\n", ans);
}return 0;
}
牛客暑期多校訓練營B Boundary
給定n個點,然後確定乙個過原點的圓,要使這n個點盡可能多的存在與圓上,最後輸出最多的存在於圓上的點的個數 三點確定乙個圓,我們已知這個圓必定經過原點,所以再依次利用三點求圓心的公式列舉每兩個點與原點 三點不共線 確定的圓心,最後選擇確定次數最多的圓心構成的圓 include include incl...
2019牛客暑期多校訓練營(第一場)
題意 題解 c 版本一 題意 題解 c 版本一 題意 題解 c 版本一 題意 題解 c 版本一 題意 題解 c 版本一 題意 題解 數學 計算幾何 邏輯推理 c 版本一 題解 特例 正三角形 取重心 中點 頂點,則期望為 公式 author stzg language c include inclu...
2019牛客暑期多校訓練營(第九場)
d knapsack cryptosystem 折半搜尋,晚上又去看了挑戰程式設計,對於時間複雜度高的情況,可以通過犧牲空間來降低時間複雜度。先把前半部分所有可以組合的情況列舉出來,然後對於後半部分依次列舉,那麼複雜度變化為o 2 36 o 2 18 2 18log 18 顯然就可做了,折半的裸題。...