快速幂 & 快速乘法算(a * b) % c

普通快速幂

long long montgomery(long long a, long long n, long long c){
	long long ans = 1;
	a = a % c;
	while(n){
		if(n & 1)ans = (ans * a) % c;
		n = n >> 1;
		a = (a * a) % c;
	}
	return ans;
}

矩阵快速幂——算矩阵\(A^b\)

typedef int arr[10][10];

void cheng(arr y, arr x){
	memset(z, 0, sizeof(z));
	for(int i = 1; i <= n; i ++)
		for(int j = 1; j<= n; j ++)
			for(int k = 1; k <= n; k ++)
				z[i][j] += y[i][k] * x[k][j];
	memcpy(y, z, sizeof(z));
}

void Montgomery(int b){
	for(int i = 1; i<= n; i ++)ans[i][i] = 1;//单位矩阵
	while(b > 0) {
		if(b & 1)cheng(ans, A);
		b = b >> 1;
		cheng(A, A);
	}
}

快速乘法

long long cheng(long long a, long long b, long long c){
	long long ans = 0;
	while(b){
		if(b & 1)ans = (ans + a) % c;
		b = b >> 1;
		a = (a << 1) % c;
	}
	return ans;
}

O(1)快速乘

inline LL KSC(LL a, LL b){
	return (a*b-(LL)((long double)a/p*b)*p+p)%p;
}

主要用于a*b的值超long long,而(a*b)%c不超long long的情况,用来避免写高精度

posted @ 2019-04-11 15:38  羽错光阴  阅读(290)  评论(0)    收藏  举报