当前位置: 代码迷 >> 综合 >> POJ 1995 Raising Modulo Numbers(快速幂取模)
  详细解决方案

POJ 1995 Raising Modulo Numbers(快速幂取模)

热度:17   发布时间:2023-12-11 20:51:20.0

题意:

(A1B1+A2B2+ ... +AHBH)mod M.

很显然这是快速幂取模,模板题,没什么好说的,简单说一下快速幂的原理(来自百度百科)

以下以求a的b次方来介绍 [1]
把b转换成 二进制数。
该二进制数第i位的权为
例如
11的二进制是1011
11 = 2?×1 + 2?×0 + 2?×1 + 2?×1
因此,我们将a??转化为算


代码:

#include <cstdio>
#define LL long long
using namespace std;LL quickmod(LL a, LL b, LL m)
{long long ans = 1;while(b){if(b&1) //看b当前2进制位是否为1{ans = (ans * a) % m;b--;}b = b >> 1;a = (a * a) % m;}return ans;
}int main()
{int z;scanf("%d", &z);while(z--){LL m,h;scanf("%I64d %I64d", &m, &h);LL ans = 0;while(h--){LL a,b;scanf("%I64d %I64d", &a, &b);ans = (ans + quickmod(a,b,m)) % m;}printf("%I64d\n", ans);}return 0;
}