CH0102 64位整數乘法 數學

題目鏈接

http://noi-test.zzstep.com/contest/0x00%E3%80%8C%E5%9F%BA%E6%9C%AC%E7%AE%97%E6%B3%95%E3%80%8D%E4%BE%8B%E9%A2%98/0102%2064%E4%BD%8D%E6%95%B4%E6%95%B0%E4%B9%98%E6%B3%95

分析

直接乘會爆 longlonglong long,一種方法是類比快速冪,將一個因數按二進制位拆解,但每次操作複雜度是 loglog 的;另一種方法是藉助 ab  mod  p=ababppa * b \ \ mod \ \ p = a * b - \lfloor {a * b \over p} \rfloor * p,可將複雜度降到 O(1)O(1)

AC代碼

#include <cstdio>

typedef long long ll;

inline ll read() {
	ll num = 0;
	char c = getchar();
	while (c < '0' || c > '9') c = getchar();
	while (c >= '0' && c <= '9')
		num = num * 10 + c - '0', c = getchar();
	return num;
}

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

int main() {
	ll a = read(), b = read(), p = read();
	printf("%lld", qmul(a, b, p));
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章