倍增
一道题
题面
一个含有N项的单调不减的数列Arr,给定一个数X,在数列Arr中找到最大的小于X的数,输出这个数,如果找不到则输出-1。
100%的数据,1 <= X, N <= 2 * 10 ^ 6, 1 <= Arr[i] <= 3 * 10 ^ 7。
输入格式:
N X
Arr[1] Arr[2] ...
这题可以用二分查找,但是,这次我们要用倍增!
思路
代码
#include <iostream>
using namespace std;
int N, X;
int Arr[200005];
int Current, Num = 1;
int main( ) {
cin >> N >> X;
for (int i = 1; i <= N; i++) cin >> Arr[i];
if (Arr[1] > X) {
cout << "-1\n";
return 0;
}
while (Num) {
if (Current + Num <= N && Arr[Current + Num] < X) {
Current = Current + Num;
Num *= 2;
} else {
Num /= 2;
}
}
cout << Arr[Current] << '\n';
return 0;
}
快速幂
题面
求Base ^ Power % Mod。
1 <= Base, Power, Mod <= 2 * 10 ^ 9
思路动画
慢
中
快
代码
#include <iostream>
using namespace std;
typedef long long ll;
ll Base, Power, Mod;
ll Pow(ll base, ll power, ll mod) {
if (power == 0) return 1;
if (power == 1) return base;
ll DivideBy2 = Pow(base, power / 2, mod);
if (power % 2 == 0) return DivideBy2 * DivideBy2;
else return DivideBy2 * DivideBy2 * base;
}
int main( ) {
cin >> Base >> Power >> Mod;
cout << Pow(Base, Power, Mod) << '\n';
return 0;
}