题目链接:http://poj.org/problem?id=1995
题目大意:给定 Z Z 组数据,每组数据给定一个(作为取模值),给定一个 H H 表示多项式有多少项,每一项给定两个数字表示该项为 AB A B ,输出结果 : ∑i=1H(Ai∗Bi)modM ∑ i = 1 H ( A i ∗ B i ) mod M
数据范围: A、B A 、 B 为int范围整数, 1≤ 1 ≤ H,M H , M ≤45000 ≤ 45000
题目解答:快速幂取模(复杂度: O(∑i=1Hlog2Ai) O ( ∑ i = 1 H log 2 A i ) )
题目代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <bitset>
using namespace std;
//快速幂
int power(int a, int b, int p)
{
int ans = 1 % p;
for( ; b; b >>= 1)
{
if(b & 1) ans = (long long) ans * a % p;
a = (long long)a * a % p;
}
return ans;
}
int main ()
{
int z;
cin >> z;
while(z--)
{
int m, h, a, b;
cin >> m >> h;
int ans = 0;
for(int i = 0; i < h; ++i)
{
cin >> a >> b;
ans = ((long long)ans + power(a, b, m)) % m;
}
cout << ans << endl;
}
}