題目描述
求 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...