对于两个大数据,如果直接相乘会导致溢出,所以需要对其进行精密化的运算
对于一个数,可以将其转化成二进制
即:11=(1011)=1* 2^3 + 0* 2^2 + 1 * 2^1+1 * 2^0
b的二进制表示:
所以
这里的计算可以用快速幂的思想,但又有不同之处,即ans的初值为0,而不是1,因为要计算每一位的加法
例题:
问题 B: 64位整数乘法
时间限制: 1 Sec 内存限制: 128 MB
提交: 652 解决: 251
[提交] [状态] [命题人:admin]
题目描述
求 a 乘 b 对 p 取模的值,其中 1≤a,b,p≤10^18。
输入
第一行a,第二行b,第三行p。
输出
一个整数,表示a*b mod p的值。
样例输入
复制样例数据
2
3
9
样例输出
6
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<math.h>
typedef long long ll;
const int xmax=1e5+7;
const int INF=1e9+7;
const int mod=10007;
using namespace std;
ll qpow(ll a,ll b,ll p)
{
ll ans=0;
if(a<b)
swap(a,b); //一种优化,使对较小的数分解成二进制
while(b)
{
if(b&1) //&操作是判断b的每一位是0还是1,是1的话就要加上
ans=(ans+a)%p;
a=(a*2)%p; //每次乘以2,实现2^i操作
b>>=1; //对b的每一位操作
}
return ans;
}
int main()
{
ll a,b,p;
scanf("%lld%lld%lld",&a,&b,&p);
printf("%lld",qpow(a,b,p));
return 0;
}