日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Divan and bitwise operations 异或,同或,组合数学(1500)

發(fā)布時(shí)間:2025/3/19 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Divan and bitwise operations 异或,同或,组合数学(1500) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個(gè)參考.


題意 :

  • 原序列長為n,給m個(gè)連續(xù)子序列的左右端點(diǎn)的下標(biāo)以及該連續(xù)子序列的或和,保證這m個(gè)連續(xù)子序列的并集包含原序列每一個(gè)點(diǎn),求原序列的所有子序列的異或和,輸出任意一種

思路 :

  • 由于位運(yùn)算對每個(gè)位都是獨(dú)立的,考慮分別對每一位求解
  • 首先看輸入的給我們帶來什么,對于[l,r]得到的同或和x,考慮它的某一位,如果這一位是0,說明[l,r]每個(gè)元素這位都是0,如果這一位是1,至少有1個(gè)1,后者沒什么用
  • 考慮某一位bit,一共有n個(gè)元素,假設(shè)有a個(gè)1,b個(gè)0,顯然有a+b=na+b=na+b=n
  • 我們?nèi)绻獙Y(jié)果(所有子序列異或和的總和),就要選出若干個(gè)元素使它們異或和為1,根據(jù)異或和的性質(zhì),需要選擇奇數(shù)個(gè)1和若干個(gè)(0)0
  • 選奇數(shù)個(gè)1的方案為Ca1+Ca3+...=2a?1C_{a}^{1}+C_{a}^{3}+... =2^{a-1}Ca1?+Ca3?+...=2a?1,選任意個(gè)0的方案為2b2^2b
  • 根據(jù)乘法原理,總方案數(shù)為2a?1?2b=2a+b?1=2n?12^{a-1}*2^b=2^{a+b-1}=2^{n-1}2a?1?2b=2a+b?1=2n?1,在當(dāng)前bit位上貢獻(xiàn)為1<<bit1<<bit1<<bit
  • 所以對于每個(gè)位,只要有1,那么這個(gè)位對結(jié)果的貢獻(xiàn)就是2n?1?(1<<bit)2^{n-1}*(1 << bit)2n?1?(1<<bit),否則這個(gè)位對結(jié)果的貢獻(xiàn)是0
  • 假設(shè)bit位存在1,那么v中就可以拆除一塊(1 << bit),我們按照這種方法把v拆成若干個(gè)塊,每個(gè)塊都能產(chǎn)生這么多貢獻(xiàn),因此可以直接用v乘上2n?12^{n-1}2n?1得到答案
  • 即,只要看哪些位有1,(1<<bit)?2n?1(1<<bit)*2^{n-1}(1<<bit)?2n?1即可,事實(shí)上,設(shè)置一個(gè)初始變量v為00…0,每次讀入一個(gè)區(qū)間,都能知道哪些位現(xiàn)在至少有一個(gè)1,這個(gè)位可以被累加答案了,v|=x
#include <iostream> #include <algorithm> #include <cstring> #include <vector> #include <unordered_set> #include <math.h> #define endl '\n' #define fi first #define se second #define pb push_backusing namespace std; using ll = long long;typedef pair<int, int> PII;const ll mod = 1e9 + 7;void solve() {int n, m, v = 0; cin >> n >> m;for (int i = 1, l, r, x; i <= m && cin >> l >> r >> x; i ++ ) v |= x;ll fac = 1;for (int i = 1; i <= n - 1; i ++ ) fac = fac * 2ll % mod;cout << fac * v % mod << endl; }int main() {cin.tie(nullptr) -> sync_with_stdio(false);int _;cin >> _;while (_ -- )solve();return 0; }

總結(jié)

以上是生活随笔為你收集整理的Divan and bitwise operations 异或,同或,组合数学(1500)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。