题目连接:
http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=2931
题目类型:
数论 - 快速模幂
数据结构:
无
思路分析:
(A1B1 + A2B2 + ... + AHBH) mod M.
既要求此公式 就先必须要化简,
需要知道定理
( a + b ) % m = ( a % m + b % m ) % m
( a ^ b % m ) = ( a % m ) ^ b % m
以此来消除 计算中出现可能溢出的大数字
至于各项中的 ai^bi % m 就利用蒙特哥利算法来解决
最后用 snt 来叠加即可
证明:
略
源代码:
#include <iostream>
#include <stdio.h>
#include <vector>
using namespace std;
typedef __int64 int64;
int64 _montgomery( int64 a, int64 b, int64 c )
{
int64 temp = 1;
while( b )
{
if( b & 1 )
{
temp = ( temp * a ) % c;
}
b >>= 1;
a = ( a * a ) % c;
}
return temp;
}
int main()
{
int t;
int64 i, a, b, M, H, snt;
scanf( "%d", &t );
while( t -- )
{
snt = 0;
scanf( "%I64d%I64d", &M, &H );
for( i = 0; i < H; i ++ )
{
scanf( "%I64d%I64d", &a, &b );
snt += _montgomery( a, b, M );
}
printf( "%I64d\n", snt % M );
}
return 0;
}