AcWing 90. 64位整数乘法
题目描述
求 a a a 乘 b b b 对 p p p 取模的值。
输入格式
第一行输入整数 a a a,第二行输入整数 b b b,第三行输入整数 p p p。
输出格式
输出一个整数,表示a*b mod p的值。
数据范围
1 ≤ a , b , p ≤ 10 18 1 \le a,b,p \le 10^{18} 1≤a,b,p≤1018
输入样例:
3
4
5
输出样例:
2
解题思路
64 64 64 位整数,可以判断使用长整型 l o n g l o n g long~long long long 或者无符号长整型
令 a = 2 a = 2 a=2, b = 34 b = 34 b=34:
2 ⋅ 34 = 2 ⋅ ( 100010 ) B 2·34 = 2·(100010)B 2⋅34=2⋅(100010)B
= 2 ⋅ ( 2 5 + 2 1 ) =2·(2^5 + 2^1) =2⋅(25+21)
= 2 ⋅ 2 5 + 2 ⋅ 2 1 =2·2^5 + 2·2^1 =2⋅25+2⋅21
参考代码
cpp
#include<iostream>
using namespace std;
typedef long long ll;
ll a, b, p, ans;
int main(){
scanf("%lld %lld %lld", &a, &b, &p);
while(b){
if(b & 1)
ans = (ans + a) % p;
a = a * 2 % p;
b >>= 1;
}
printf("%lld", ans);
return0;
}