首先需要知道一个公式 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
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/stffer/article/details/47333769