POJ 1995 Raising Modulo Numbers
题目链接——>点击打开链接
Raising Modulo Numbers
Time Limit: 1000MS | Memory Limit: 30000K | |
Total Submissions: 9527 | Accepted: 5794 |
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 from all players including oneself and determine the remainder after division by a given number M. The winner is the one who first determines the correct result. According to the players' experience it is possible to increase the difficulty by choosing higher numbers.
You should write a program that calculates the result and is able to find out who won the game.
Input
The input consists of Z assignments. The number of them is given by the single positive integer Z appearing on the first line of input. Then the assignements follow. Each assignement begins with line containing an integer M (1 <= M <= 45000). The sum will be divided by this number. Next line contains number of players H (1 <= H <= 45000). Next exactly H lines follow. On each line, there are exactly two numbers Ai and Bi separated by space. Both numbers cannot be equal zero at the same time.
Output
For each assingnement there is the only one line of output. On this line, there is a number, the result of expression
(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
Problem Idea
【题意】
题目理解:计算表达式的结果 (A1^B1 + A2^B2 + ... + AH^BH)mod M
【类型】
快速幂取模
【分析】
快速幂取模,模板题,入门。
【输入输出要求】
输入输出要求,用中文复述一下:
输入由Z组测试用例组成。
它们的数量由出现在第一行输入上的单个正整数Z给出。
每个作业始于包含整数M的行(1 <= M <= 45000)。总和将除以这个数字。
下一行包含玩家人数H(1 <= H <= 45000)。
接下来就是H行:在每一行上,有两个数字Ai和Bi由空格分开。这两个数字不能同时等于零。
对于每个assingnement,只有一行输出。在这一行上,有一个数字,即表达式的结果 (A1^B1 + A2^B2 + ... + AH^BH)mod M.
【注意】
无
Source Code
#include <iostream>
using namespace std;
int quick(int a,int b,int c){
int ans=1;//记录幂结果
a=a%c; //预处理,使得a处于c的数据范围之下
while(b!=0){
if(b&1) ans=(ans*a)%c;如果b的二进制位不是0,那么我们的结果是要参与运算的
b>>=1;//二进制的移位操作,相当于每次除以2,用二进制看,就是我们不断的遍历b的二进制位
a=(a*a)%c;//不断加倍
}
return ans;
}
int main(int argc, char** argv) {
int T;
int m,a,b,h;
cin>>T;
while(T--){
int ans=0;
cin>>m;//mod的数
cin>>h;//a,b的个数
for(int i=0;i<h;i++){
cin>>a>>b;
ans=(ans+quick(a,b,m))%m;
}
cout<<ans<<endl;
}
return 0;
}
Code Temple
int quick(int a,int b,int c){
int ans=1;//记录幂结果
a=a%c; //预处理,使得a处于c的数据范围之下
while(b!=0){
if(b&1) ans=(ans*a)%c;如果b的二进制位不是0,那么我们的结果是要参与运算的
b>>=1;//二进制的移位操作,相当于每次除以2,用二进制看,就是我们不断的遍历b的二进制位
a=(a*a)%c;//不断加倍
}
return ans;
}