64位整数乘法[快速幂]
题面
求a*b对p取模的值,其中1\(\leq\)a,b,p\(\leq\)\(10^{18}\)
思路
类似于快速幂的思想把b用二进制表示,(选较大的数用二进制表示会优秀一些)
那么a\(*\)b=\(c_{k-1}\)\(*\)a\(*\)\(2^{k-1}\)+\(c_{k-2}\)\(*\)a\(*\)\(2^{k-2}\)+……+\(c_{0}\)\(*\)a\(*\)\(2^{0}\);
递推处理一下
代码
#include <iostream>
#include <cstdio>
#define ll long long
using namespace std;
inline ll read(){
register ll x=0,f=1;
register char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
while (c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-'0',c=getchar();
return x*f;
}
ll a,b,p,sum;
int init(){
a=read(),b=read(),p=read();
}
int doit(){
if (a>b) swap(a,b);
while (b){
if (b&1) sum=(sum+a)%p;
a=a*2%p;
}
printf("%ld",sum);
}
int main(){
init();
doit();
return 0;
}

浙公网安备 33010602011771号