傳送門求\(n\)個數中子集內所有數異或為\(0\)的子集大小之和。
對於子集大小我們不好維護,因此我們可以轉換思路變成求每個數的貢獻。
首先我們將所有數的線性基的基底\(b\)求出來(設秩為\(r\)),然後非基地元素的貢獻就是\(2^\),即選擇這個數然後其他所有非基底元素都可以選擇或者不選擇兩種方法,選擇非基底元素後我們再從基底裡面挑出能過把它異或為\(0\)的數選出來就可以達到題目的要求。
對於基底元素\(x\),我們將非基底的\(n-r\)個元素再跑乙個線性基\(other\)出來,然後用\(b\)中除去\(x\)外的剩餘元素和\(other\)構成的新的線性基\(d\)來進行選擇看能不能將\(x\)消掉(理由同上),如果可以消掉那麼\(x\)的貢獻是\(2^\)。
注意後面列舉\(x\)要用最初始題目給的數而不能用\(b\)中的數,反例:
\(7\)
\(8\)
\(6\)
\(8\)
\(9\)
\(8\)
如果直接從基里挑會直接把\(7\)和\(6\)(的第\(2,3\)個二進位制位)一起挑出來,\(6\)本來還可以提供個\(0110\)的,但是往基里一放就被7搞沒了。
我說的可能不太清楚,那麼可以看這篇部落格~
#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;
typedef long long ll;
typedef pairpll;
typedef pairpli;
typedef pairpil;;
typedef pairpii;
typedef unsigned long long ull;
#define lson rt<<1
#define rson rt<<1|1
#define lowbit(x) x&(-x)
#define name2str(name) (#name)
#define bug printf("*********\n")
#define debug(x) cout<<#x"=["ll a[maxn], b[105], other[105], tmp[105];
ll qpow(ll x, int n)
return res;
}bool ins(ll x, ll base) }}
return false;
}int main()
if(r == n)
ll ans = qpow(2, n - r - 1) * (n - r) % mod;;
for(int i = 1; i <= n; ++i)
for(int i = 0; i < vec.size(); ++i)
for(int j = 0; j <= 63; ++j)
if(!ins(vec[i], tmp))
}printf("%lld\n", ans);
}return 0;
}
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 的 最小值的...
2019牛客多校第一場 F題
牛客多校第一場f random point in 給你個三角形abc,隨便丟個點p在三角形中,問max sabp,sacp,sbcp 的期望值乘36的結果。根據重心的性質,我們知道三個三角形被取到的概率 p點落在三個區域的面積 是一樣大的。公式為 e 1 3e1 1 3e2 1 3e3 根據對稱性,...