数论 FZU 1759 Super A^B mod C
2016-09-12 20:19
405 查看
Super A^B mod C |
Time Limit: 1000ms, Special Time Limit:2500ms, Memory Limit:65536KB |
Problem description |
计算A^B%C的结果,A^B是指A的B次方。 |
Input |
多组测试数据,每组数据仅一行,分别为A,B,C的值。 A,B,C均为正整数。(1<=A,C<=1000000000,1<=B<=10^1000000). |
Output |
对于每组测试数据,输出一行,为A^B%C的值。 |
Sample Input |
3 3 34 4 4 |
Sample Output |
00 |
1. 大整数取模
其实就是一个模运算转换了一下,就像下面这个例子
1234=((((0*10)+1)*10+2)*10+3)*10+4 mod n
由于只有*,+运算,可以将mod放进去 , 所以只需要,从最高位一位一位的×10取模就行了
2.欧拉定理扩展
首先欧拉定理
当a的指数很大的时候,可以推出
3.快速幂
代码如下
#include <iostream> #include <cmath> #include <cstring> typedef long long llt ; using namespace std; int euler_phi(int n) { int m = floor(sqrt(n+0.5)); int ans = n; for(int i = 2; i <= m; i++) if(n%i == 0){ ans = ans / i * (i-1); while(n%i == 0) n /= i; } if(n > 1) ans = ans / n *(n-1); return ans; } //利用二进制计算a*b%mod llt multiMod(llt a,llt b,llt mod){ llt ret = 0LL; a %= mod; while( b ){ if ( b & 1LL ) ret = ( ret + a ) % mod, --b; b >>= 1LL; a = ( a + a ) % mod; } return ret; } //计算a^b%mod llt powerMod(llt a,llt b,llt mod){ llt ret = 1LL; a %= mod; while( b ){ if ( b & 1LL ) ret = multiMod(ret,a,mod),--b; b >>= 1LL; a = multiMod(a,a,mod); } return ret; } char big[1000050]; llt bigMod(int mod){ llt ret = 0; int len = strlen(big); for (int i = 0;i < len ;++i){ ret %= mod; ret = ret * 10 + big[i]-'0'; }ret %= mod; ret += mod; return ret; } int main(){ llt a,b,c; ios::sync_with_stdio(false); while(cin>>a>>big>>c){ int er = euler_phi(c); llt ans; int len = strlen(big); if ( len <= 10 ) { b = 0; for (int i = 0 ;i < len;++i) b = b*10 + big[i]-'0'; ans = powerMod(a,b,c); } else { b = bigMod(er); ans = powerMod(a,b,c); } cout <<ans<<endl; } }
相关文章推荐
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- C#递归算法之分而治之策略
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- C#算法之大牛生小牛的问题高效解决方法
- C#算法函数:获取一个字符串中的最大长度的数字
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- 经典排序算法之冒泡排序(Bubble sort)代码
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法