POJ1995 ZOJ2150 Raising Modulo Numbers【快速模冪】
阿新 • • 發佈:2019-02-08
Time Limit:1000MS | Memory Limit:30000K |
Total Submissions:8010 | Accepted:4875 |
Description
People are different. Some secretly read magazines full of interesting girls' pictures, others create an A-bomb in their cellar, others like using Windows, and some like difficult mathematical games. Latest marketing research shows, that this market segment was so far underestimated and that there is lack of such games. This kind of game was thus included into the KOKODáKH. The rules follow:Each player chooses two numbers Ai and Bi and writes them on a slip of paper. Others cannot see the numbers. In a given moment all players show their numbers to the others. The goal is to determine the sum of all expressions AiBi
You should write a program that calculates the result and is able to find out who won the game.
Input
Output
(A1B1+A2B2+ ... +AHBH)mod M.
Sample Input
3 16 4 2 3 3 4 4 5 5 6 36123 1 2374859 3029382 17 1 3 18132
Sample Output
2 13195 13
Source
問題簡述:參見上述連結。
問題分析:
這是一個單純的模冪計算和求和問題,呼叫模冪計算函式即可。
不用快速模冪計算的話,時間上會超時。
程式說明:函式powermod()是模冪計算函式。
AC的C++語言程式如下:
/* POJ1995 ZOJ2150 Raising Modulo Numbers */
#include <iostream>
using namespace std;
typedef unsigned long long ULL;
// 模冪計算
ULL powermod(ULL a, ULL n, ULL m)
{
ULL res = 1LL;
while(n) {
if(n & 1LL) { // n % 2 == 1
res *= a;
res %= m;
}
a *= a;
a %= m;
n >>= 1;
}
return res;
}
int main()
{
int z, m, h, ai, bi, ans;
cin >> z;
while(z--) {
cin >> m >> h;
ans = 0;
while(h--) {
cin >> ai >> bi;
ans += (int)powermod(ai, bi, m);
}
ans %= m;
cout << ans << endl;
}
return 0;
}