(A^B)%C 快速幂乘
2015-10-24 16:52
225 查看
<span style="font-size:18px;"><strong>简单数论的快速幂乘问题</strong></span> #include<iostream> using namespace std; int main() { int a,b,c; while (scanf("%d%d%d",&a,&b,&c)!=EOF&&a!=0&&b!=0&&c!=0) { int ans = 1; a=a%c; while (b>0) { if(b%2==1) // 作用1:当 b为奇数,则先单独乘一个a // 作用:当 b=1时,即 已经乘了 b=b/2=1后,将值赋给k ans = (ans * a) % c; a = (a * a) % c; b = b / 2; //a1=a%c 1=2^0 // a2=((a%c)*(a%c))%c 2=2^1 // a3=((a%c*a%c)%c*(a%c*a%c)%c) 4=2^2 //由此,可知 b=b/2 ,每次的 a 的个数为上一次的 2倍 } printf("%d\n",ans); } return 0; }
引用快速幂乘的经典实例uva 11582
思路:设g(i)=f(i) mod n,当二元组(g(i)、g(i+1))出现重复时,整个序列就开始重复
余数最多n种,所以最多n^2项就会出现重复。设周期为m,只需计算出g(0)~g(n^2)项,然后计算g(a^b)等于其中的哪一项即可
但是,n<=1000,那么n方的规模会达到10^6,显然f(n^2)有些庞大
我们可以利用(a+b)mod n=((a mod n)+(b mod n))mod n 优化
那么g(i+2)=g(i+1)+g(i)=(f(i+1)mod n + f(i)mod n )mod n=(g(i+1)+g(i))mod n
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn = 2005001; int g[maxn]; unsigned long long a,b; int PowerMod(unsigned long long a,unsigned long long b,int c) { int ans = 1; a = a % c; while(b>0) { if(b % 2 == 1) ans = (ans * a) % c; a = (a * a) % c; b = b / 2; } return ans; } int main() { int t; scanf("%d",&t); while(t--) { int n; cin >> a >> b >> n; if(n == 1) { puts("0"); continue; } int m = 1; g[1] = 1,g[2] = 1; int i = 3; while(1) { g[i] = (g[i - 2] + g[i - 1]) % n; if(g[1] == g[i-1] && g[2] == g[i]) break; i++; } m = i - 2; int s = PowerMod(a,b,m); cout<<g[s]<<endl; } return 0; }
相关文章推荐
- android台 cocos2d-x 翻阅相册数据
- 使用Apache怎么添加虚拟域名
- 使用loadrunner进行性能测试(二)--参数化
- 芒果iOS开发人事面试问题及答案汇总三
- Python3便捷的操作——导入模块
- php.ini中safe_mode开启对PHP系统函数的影响
- W5500 keep-alive的用途及使用
- 转载:程序员应该扪心自问的10个问题
- Arraylist无法转换为Collection,东软集团笔试题第6题
- 查看String.equals()方法的实现代码,注意学习其实现方法
- java 更改list 某一元素?
- 可以一直接收键盘字符,并将大写转为小写,小写转为大写,数字不作处理
- IntelliJ IDEA 创建第一个Mybatis工程
- 声明和定义
- 信号量的PV操作实例
- C语言 判断花括号是否成对出现
- Ext Store 转为对象数组字符串
- SPOJ LCS Longest Common Substring
- 创建maven项目时报错:Failed to execute goal org.apache.maven.plugins:maven-archetype-plugin:2.4
- 系统利益相关者描述案例