2019牛客多校第一場 H XOR

2021-09-25 10:19:24 字數 1258 閱讀 4921

複習線性基複習了好久。。。

這題的關鍵是把異或為0的集合的大小之和轉化為乙個數字會在多少個異或為0的集合**現,然後每個數字的這個值加起來就行。

先求乙個線性基,其中插入了r個數字,那麼剩下的n-r個數字的任意組合異或都可以由線性基中的一些數異或表示,那麼它們異或起來就為0.

考慮線性基外的乙個數字,我先欽定乙個數字njr[i],然後看他會在多少個異或為0的集合**現,就是它的貢獻,顯然,剩下n-r-1個數字的任意組合再加上它的異或都是0,那麼貢獻就是2^

那麼線性基外的所有數字的貢獻就是 (n-r)*2^

再考慮線性基裡面的數字r[i]的貢獻,如果他能被剩下的n-1個數字表示,那麼它就是有貢獻。

那麼我們對剩下的n-1個數字求乙個線性基,嘗試把r[i]插入,如果插入不成功的話,那麼這個數字就可以由剩下的n-1個數字表示

由線性基的性質我們知道,乙個序列可以有多個線性基,他們能表示的結果是相同的,線性基中數字的個數也是相同的,他們其實是等價的。

(線性基若干性質及證明

所以r[i]如果可以由剩下n-1個數字表示,貢獻也為2^。

在實際實現的時候,對於每個r[i],我們不用每次都求一遍n-1個數字的線性基,而是先求出n-r個原線性基b1外的數字的線性基b2,再把r[1-rcnt]中除了r[i]的數字加進去得到b3,再判斷r[i]是否能插入b3,判斷下乙個數字r[i+1]的時候,再b3還原到b2。

#include#define maxl 100010

using namespace std;

const int mod=1e9+7;

int n,rcnt,njrcnt;

long long ans;

long long a[maxl],r[maxl],njr[maxl];

struct lb

inline bool insert(long long x)

inline void rebuild()

return ans;

}inline void mainwork()

long long tmp=qp(2,njrcnt-1);

ans=1ll*njrcnt*tmp%mod;

for(int i=1;i<=njrcnt;i++)

b2.insert(njr[i]);

for(int i=1;i<=rcnt;i++) }

inline void print()

int main()

return 0;

}

2019牛客多校第一場H XOR 線性基

給出n個數的集合a 找出乙個子集s滿足s中的所有元素異或後為0 mod 1000000007 求 s 線性基介紹 算每個元素出現在滿足要求的集合的次數,也就是每個元素對答案的貢獻。所以先求出線性基d1 對於線性基以外的元素,必然可以由線性基的異或和表示,所以完全為線性基外元素的異或和也仍然可以由線性...

2019牛客多校第一場

看到這裡我還能說什麼呢?自己慢慢證吧 就是這個 而 了 大佬們的結論是 三角形面積的22倍。我.手動膜拜。不會證.while true try x1,y1,x2,y2,x3,y3 map int,input split s abs x1 y2 x2 y1 x2 y3 x3 y2 x3 y1 x1 y...

2019 牛客多校 第一場

a 題意 就是兩個陣列,找最大的p,使對於1到p的所有子區間都保證最小值的下標相同 題解 每次往後加乙個值 第i 1位 都會多出 i 個區間,當a i 1 大於max a 1 a i 時沒有影響,當a i 小於max a 1 a i 時,因為a i 1 的加入會導致區間的rmq l到r 的 最小值的...