快速幂模m算法
来源:互联网 发布:淘宝如何代运营 编辑:程序博客网 时间:2024/06/05 18:23
求解a^b,可以把b按二进制展开为b=bn2^n+b(n-1)2^(n-1)+…+b1*2+b0.(其中bi为1或0),那么
a^b=a^(bn2^n+b(n-1)2^(n-1)+…+b1*2+b0);
long long power (long long a, long long b){ long long ans = 1; while (b) { if (b & 1) ans = ans * a; b / =2; a = a * a; } return ans;}
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 Ai Bi 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.
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 Ai Bi 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
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
2
13195
13
#include<iostream>#include<algorithm>#include<cstring>#include<cstdio>using namespace std;unsigned long long power(unsigned long long a,unsigned long long b,unsigned long long m){ unsigned long long ans=1; while(b) { if(b&1) ans=(ans*a)%m; b/=2; a=a*a%m; } return ans;}int main(){ int N; cin>>N; while(N--) { unsigned long long m,n,result=0,a,b; cin>>m; cin>>n; while(n--) { cin>>a>>b; result=(result+power(a,b,m))%m; } cout<<result<<endl; } return 0;}
0 0
- 快速幂模m算法
- 快速幂(模m)算法
- poj 1995 整数快速幂模m
- 快速求m^e mod n算法
- 快速幂模m HDU——1061 Rightmost Digit
- 001-整数快速幂-归纳法-《算法设计技巧与分析》M.H.A学习笔记
- 最小M段和 O(nlogn)快速算法
- 【算法】求n的m次方(快速幂取模)
- Montgomery 快速幂模算法
- Montgomery 快速幂模算法
- 快速幂&&快速计算(a*b)mod m
- 快速幂&快速幂取模算法
- 快速幂与Montgomery 快速幂模算法
- 快速幂二进制取模算法
- [算法]快速指数模
- 快速求幂算法
- 快速求幂算法
- 快速幂算法
- win8下cocos2d-x 3.0+vs2012环境配置及项目创建
- maven+eclipse+tomcat配置过程记录
- java8中compile方法的源码
- 武大打铁之后
- java可重入锁ReentrantLock原理
- 快速幂模m算法
- Android 图片如何高效加载与缓存 (4.5) —— 缩略图生成的优化
- 循环队列
- SQLDeveloper 远程连接 Mysql
- GridView
- 分析zookeeper到底能做什么?
- 编译系统(预处理、编译、汇编、链接)-详解
- 备忘录模式
- Spring事务配置的五种方式和spring里面事务的传播属性和事务隔离级别