建國中學 游承曦
\(\to 18_{(10)} = 10010_{(2)}\)
暖身食酢題
位元運算子的優先順序很低,記得加括號使用!
*以非負整數為主
*以非負整數為主
給你一個正整數 \(x\),問把 \(x\) 變成 \(x+1\) 在二進位下需要進位幾次?
Hint:
後綴 \(1\) 數量
給你 \(n\) 個數字,其中只有一個數出現的次數為奇數,找出那個數?
\(n \leq 10^5, \ 0 \leq x_i\) \(\leq 2^{31}\)
\(\mathcal{O}(n)\) Hint:
Xor
給你 \(n\) 個數字 \(x\),你需要把他們排序好,而排序準則是先照 \(popcount(x)\) 由小到大排,若一樣則照原始順序輸出
\(n \leq 10^5, \ 0 \leq x \leq 2^{30}\)
\(popcount(x) : x\) 在二進位下有幾個 bit 為 \(1\)
給你 \(n\) 個數 \(a_i\) 和 \(q\) 次詢問
每次詢問區間 \([a_l, ..., a_r]\) Xor 起來的值
\(n, q \leq 10^6, 0 \leq a_i \leq 10^{18}\)
桌面上有許多堆豆子和一個筒子。
現在進行一種遊戲:每次找一堆豆子,如果這堆豆子只有1個,就將它放入筒子,
如果多於一個,則將它分成盡量多而且相等的兩堆,並且把剩下的一個(如果有的話)丟掉。
重複進行許多次之後,所有的豆子要不是在筒子內就是被丟掉了。
現在,我們想要知道在遊戲中會有多少豆子被放入筒子。
\(n \leq 100; a_i \leq 10^7\)
如果要求 \(x^n\) ?
\(x\) 乘 \(n\) 次會不會太慢 ?
\(n=10^9\) ?
求出 \(x^{\lfloor \frac{n}{2} \rfloor}\) 後再平方就是 \(x^n\),
若 \(n\) 是奇數,再乘上一次 \(x\) 就好了!
複雜度 \(\mathcal{O}(\log n)\)
int64_t power(int64_t x, int64_t n){
if(n == 0) return 1;
if(n == 1) return x;
int64_t res = power(x, n / 2);
res = res * res;
if(n % 2 == 1) res *= x;
return res;
}
e.g. \(3^{19} = (1 \times 3^1) \times (1 \times 3^2) \times (0 \times 3^4) \times (0 \times 3^8) \times (1 \times 3^{16})\)
一邊做 \(3\) 的自乘一邊算答案!
\(\because 19_{(10)} = 10011_{(2)}\)
int64_t power(int64_t x, int64_t n){
int64_t res = 1;
while(n > 0){
if(n % 2 == 1) res *= x;
x *= x;
n /= 2;
}
return res;
}
int64_t power(int64_t x, int64_t n){
int64_t res = 1;
while(n){
if(n & 1) res *= x;
x *= x;
n >>= 1;
}
return res;
}
蠻噁的位元運算寫法
求 \(a \times b \bmod m\)
\(0 \leq a, b \leq 10^{18}, \ 1 \leq m \leq 10^{18}\)
盡量不要用 python :p
一個簡單的題目:
給你 \(n \leq 20\) 個數字,
問你有沒有辦法選一些數字使其總和為 \(k\) ?
有兩個集合 \(A, B\)
\(A \land B : A \& B\)
\(A \lor B : A \mid B\)
判斷第 \(i\) 個元素是不是在集合 \(A\) 裡: A & (1<<i) 或 (A >> i) & 1
包含所有元素的集合: (1<<n)-1
int n, a[20];
int k;
bool found = false;
for(int s=1 ; s<(1<<n) ; ++s){
int sum = 0;
for(int i=0 ; i<n ; ++i){
if(s & (1<<i)){
sum += a[i];
}
}
if(sum == k){
found = true;
}
}
小複雜的枚舉子集題目
給你 \(n\) 個數 \(a_i\),
問有幾組 \((i, j)\) 符合 \(i < j\) 且 \(a_i \& a_j \geq a_i \oplus a_j\) ?
\(n \leq 10^5\)
給你 \(n\) 個數 \(x_i\),
求 \(\displaystyle \sum_{i=1}^n \sum_{j=1}^n \sum_{k=1}^n (x_i \& x_j) \cdot (x_j \mid x_k)\) ?
\(n \leq 5 \times 10^5\)
給你 \(a, b, k\)
構造兩個 0-1 字串 \(x, y\) 各有 \(a\) 個 0 和 \(b\) 個 1 (不能有前綴 0)
且 \(x-y\) 有 \(k\) 個 1
\(0 \leq a; 1 \leq b; 0 \leq k \leq a+b \leq 2 \times 10^5\)