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;
}

posted @ 2022-09-14 16:57  ancer  阅读(29)  评论(0)    收藏  举报