算法競賽進階指南--快速冪,求a^b mod p

// 快速冪,求a^b mod p
int power(int a, int b, int p) {
	int ans = 1;
	for (; b; b >>= 1) {
		if (b & 1) ans = (long long)ans * a % p;
		a = (long long)a * a % p;
	}
	return ans;
}

// 64位整數乘法的O(log b)算法
long long mul(long long a, long long b, long long p) {
	long long ans = 0;
	for (; b; b >>= 1) {
		if (b & 1) ans = (ans + a) % p;
		a = a * 2 % p;
	}
	return ans;
}

// 64位整數乘法的long double算法
long long mul(long long a, long long b, long long p) {
	a %= p, b %= p; // 當a,b一定在0~p之間時,此行不必要。
	long long c = (long double)a * b / p;
	long long ans = a * b - c * p;
	if (ans < 0) ans += p;
	else if (ans >= p) ans -= p;
	return ans;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章