1,整数快速幂:
C++ Code
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
///快速幂 a^b int qpow( int a, int b) { if(a== 0) return 0; int ans= 1; while(b) { if(b& 1) ans*=a; ///和快速乘法的区别 b>>= 1; ///等价于b=b>>1和b=b/2; a*=a; ///区别,同上 } return ans; } |
2,含有取余的整数快速幂:
C++ Code
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
#include <iostream>
using namespace std; int pw( int x, int y, int p) { if (!y) { return 1; } int res = pw((x * x) % p, y / 2, p); if (y & 1) //判断奇偶性 y&1==1为奇数,反之为偶数 { res = res * x % p; } return res; } int main() { int x, y, p; cin >> x >> y >> p; cout << pw(x, y, p) << endl; return 0; } |
C++ Code
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
///a^b结果取余mod int qpow_mod( int a, int b, int mod) { if(a== 0) return 0; int ans= 1; while(b) { if(b& 1) ans=(ans%mod)*(a%mod); ///如果确定数据不会爆的话,可写成 ans*=a%=mod; b>>= 1;a*=a%=mod; ///等价于a=(a%mod)*(a%mod),且将一个模运算通过赋值代替,提高了效率 } return ans%mod; ///数据不会爆的话,这里的%运算会等价于第5中不断重复的 ans%mod } ///1.(a*b) mod M=(a mod M)*(b mod M) mod M; ///2.(a+b) mod M=(a mod M+b mod M) mod M; ///3.(a/b) mod M=(a*b^(M-2)) mod M;(费马小定理) |
C++ Code
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
#include <cstdlib>
#include <cstring> #include <cstdio> #include <iostream> using namespace std; int N; ///以3*3的矩阵为例 struct matrix { int a[ 3][ 3]; } origin,res; matrix multiply(matrix x,matrix y) { ///矩阵乘法 matrix temp; memset(temp.a, 0, sizeof(temp.a)); for( int i= 0; i< 3; i++) { for( int j= 0; j< 3; j++) { for( int k= 0; k< 3; k++) { temp.a[i][j]+=x.a[i][k]*y.a[k][j]; } } } return temp; } void init() { ///初始化,产生随机数 printf( "随机数组如下:\n"); for( int i= 0; i< 3; i++) { for( int j= 0; j< 3; j++) { origin.a[i][j]=rand()% 10; printf( "%8d",origin.a[i][j]); } printf( "\n"); } printf( "\n"); memset(res.a, 0, sizeof(res.a)); res.a[ 0][ 0]=res.a[ 1][ 1]=res.a[ 2][ 2]= 1; ///将res.a初始化为单位矩阵 } void calc( int n) { ///快速幂核心代码 while(n) { if(n& 1) res=multiply(res,origin); n>>= 1; origin=multiply(origin,origin); } printf( "%d次幂结果如下:\n",n); for( int i= 0; i< 3; i++) { for( int j= 0; j< 3; j++) printf( "%8d",res.a[i][j]); printf( "\n"); } printf( "\n"); } int main() { ///主函数 while(cin>>N) { init(); calc(N); } return 0; } |