2019牛客暑期多校訓練營(第一場)H XOR

2021-09-25 15:46:14 字數 1038 閱讀 3430

題意:給定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 顯然就可做了,折半的裸題。...