0x01 基本演算法 位運算

2022-01-10 08:07:32 字數 2194 閱讀 1955

題目描述

求 a 的 b 次方對 p 取模的值,其中 0 <= a,b,p <= 10^9

輸入描述:

三個用空格隔開的整數a,b和p。

輸出描述:

乙個整數,表示a^b mod p的值。

例項

輸入: 2 3 9

輸出: 8

思路

這道題是要先算出a的b次冪再對其結果進行求模(取餘),因為b最大可為1e+9,按普通做法來做時間複雜度就太大了,顯然這樣過不了題,

能快速算a的b次冪,就能減小時間複雜度,快速冪就是一種不錯的方法。

什麼是快速冪

快速冪是一種簡化運算底數的n次冪的演算法,理論上其時間複雜度為 o(log₂n),而一般的樸素演算法則需要o(n)的時間複雜度。簡單來說快速冪其實就是抽取了指數中的2的n次冪,將其轉換為時間複雜度為o(1)的二進位制移位運算,所以相應地,時間複雜度降低為o(log₂n)。

**原理

以 \(a^\) 為例,

先把指數13化為二進位制就是1101,把二進位制數字1101直觀地表現為十進位制則是如下的等式:

\[13 = 1 * (2^3) + 1 * (2^2) + 0 * (2^ 1) + 1 * (2^0)

\]這樣一來 \(a^\) 可以如下算出:

\[a^ = a ^ * a ^ * a ^

\]完整ac**如下

#includeusing namespace std;

typedef long long ll;//將long long型別取個別名:ll型別,為了方便

int power(int a, int b, int mod)

return ans;

}int main()

與上面a題寫法一樣

typedef long long ll;

int _;

// 稍微優化下上方**:update 21/01/28

ll qpow(ll a, ll b, ll mod)

int main()

cout << ans << endl;}}

思路:類似快速冪的思想,把整數b用二進位制表示,即

\[b = c_2^ + c_2^ + ... + c_02^0

\]

typedef long long ll;

int main()

cout << ans << endl;

}

解題思路

題意:

貪心從高位到低位列舉,檢驗當前位在初始值為\(0\) 情況下的答案是否可以為\(1\) ,如果不能則檢驗當前位初始值能否為 \(1\),並檢驗當前位在初始值為 \(1\) 情況下的答案是否可以為 \(1\)。

int n, m, x;

string str;

paira[100005];

int work(int bit, int now)

return now;

}int main()

int val = 0, ans = 0;

for (int bit = 29; bit >= 0; bit--)

cout << ans << "\n";

return 0;

}

演算法高階 0x01 位運算

一 快速冪的模板 a b p includeusing namespace std intmain cout 注意點 1 轉換成long long型別可以直接乘1ll,作用與 long long 相同,範圍大概為10 19,int為2 147 483 647。2 以2 7為例,7 4 2 2 2 2...

閱讀筆記 0x01 位運算

1.補碼表示 x 1 x 2.自然溢位 unsigned long long 自動對2 32取模,可以用來hash。3.基本位運算操作 左移 1 n 1 2n,n 2 4n,n 3 8n。算術右移 n 1 n 2 n 4 n 16。算術右移 除以2向下取整 e.g.3 1 2,3 1 1 p.s.整...

0x01 基本命令

上 ctrl p previous 下 ctrl n next 左 ctrl b backward 右 ctrl f forward del ctrl d delete home ctrl a the first letter end ctrl e end 清除整行 ctrl u 刪除游標到行末 c...