快速幂取模 ---> (a^b)%c
来源:互联网 发布:sql的文件保存在哪 编辑:程序博客网 时间:2024/05/22 13:28
首先需要知道一个公式 a*b%c=((a%c)*b)%c,然后就可以根据这个公式试着写一个效率并不高的算法。
/* (a*a*a*...*a)%c =((a*a*..*a)%c*a)%c =(((a*..*a)%c*a)%c*a)%c =(((((a%c*a)%c...*a)%c*a)%c*a)%c*a)%c*/#include<stdio.h>int qmod(int a,int b,int c){ //根据推出的式子,易知 int sum=a%c; b=b-1; while(b--) { sum=sum*a%c; } //为了更为美观简洁,可写成 int sum=1;//a*1=a while(b--) { sum=sum*a%c; } return sum;}int main(){//a*b%c==((a%c)*b)%c int a,b,c; while(scanf("%d%d%d",&a,&b,&c)!=EOF) { printf("%d\n",qmod(a,b,c)); }}
接下来就是提高效率的问题了,怎样提高效率?
这个公式 a^b %c ,上面已经优化了mod 取模方面
现在关键就是优化 a^b 了。
这两个简单公式需要记住: 1):a^b=(a^2)^(b/2) -->b为偶数 2):a^b=(a^2)^(b/2)*a -->b为奇数
#include<stdio.h>int qmod(int a,int b,int c){ int sum=1; while(b) { if(b&1) sum=sum*a%c;//要多乘一个a; a=a*a%c; b>>=1; } return sum;}int main(){//a*b%c==((a%c)*b)%c int a,b,c; while(scanf("%d%d%d",&a,&b,&c)!=EOF) { printf("%d\n",qmod(a,b,c)); }}
附:1): yy 右移 x 代表 yy 除以 2^x 2):yy 左移移 x 代表 yy 乘以 2^x
0 0
- 快速幂取模 ---> (a^b)%c
- fzu 1752 A^B mod C(快速乘+快速幂取模)
- 快速计算(a^b)%C
- FZU1759Super A^B mod C(快速幂取模) 公式
- FZU1752&1650--A^B mod C--快速幂取模
- 51Nod-1046 A^B Mod C(快速幂取模)
- 快速幂,a^b mod c
- A^B%C 快速幂模版
- (A^B)%C 快速幂乘
- (A^B)%C 快速幂乘
- A^B Mod C(快速幂算法)
- A^B mod C(快速幂模板)
- a^b(快速幂取模)
- FZU1759 Super A^B mod C(快速幂求余+ a^b%c = a^( b%phic+phic )%c)
- 【快速幂取模】HDU 2035---人见人爱A^B
- hdu2035 人见人爱A^B(快速幂取模)
- HDOJ 2035 人见人爱A^B(快速幂取模)
- HDU 2035 人见人爱A^B (快速幂取模)
- CRC
- 括号配对问题 nyoj 2
- 【iOS学习笔记】Category和Extension
- php中的单例模式实现
- leetcode_Invert Binary Tree
- 快速幂取模 ---> (a^b)%c
- 进程间通信-队列
- 关于51单片机IO引脚的驱动能力与上拉电阻
- 设计模式—简单工厂模式
- 基于mysql的程序抛异常 Unable to find the requested .Net Framework Data Provider. It may not be installed
- c++ list iterator not incrementable
- 浅析桌面端数据分析程序语言
- 为什么要使用ngx_lua
- 关于中断的buttom half