位运算
例题一:
求 a 的 b 次方对 p 取模的值。
输入格式:
第一行输入整数a,第二行输入整数b,第三行输入整数p。
输出格式:
输出一个整数,表示a*b mod p的值。
数据范围:
1≤a,b,p≤10^18
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a, b, p, ans = 1;
int main()
{
cin >> a >> b >> p;
while(b){
if(b&1) ans = ans * a % p;
b >>= 1; //位运算将b的二进制数向右移一位
a = a * a % p; //b当前位是第几位,对应a的(2的几次方)次方
}
cout << ans % p << endl;
return 0;
}
做完例题后的感悟:
使用位运算思路:
/大型数据的计算会使时间非常庞大,使用位运算可以优化时间,使O(n)复杂度降低到log级。/
如果b当前位是1,则将a乘入,a的值随对b的位操作的同时变化,变化规律如下。
b位数 ans a
1 3 3^2
2 3^3 3^4
3 3^7 3^8
… … …
例题二:
求 a 乘 b 对 p 取模的值。
输入:
第一行输入整数a,第二行输入整数b,第三行输入整数p。
输出:
输出一个整数,表示a*b mod p的值。
数据范围:
1≤a,b,p≤10^18
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a, b, k, ans = 0;
int main()
{
cin >> a >> b >> k;
while(b){
if(b&1) ans = (ans + a) % k;
b >>= 1;
a = a * 2 % k;
}
cout << ans << endl;
return 0;
}
题后反思:
和例题一一样利用了位运算的思想,利用位的关系减少相加次数,优化时间复杂度。