快速幂

快速幂的原理:a^b=(a*a)^b/2(当b为偶数)

                    a^b=a*(a*a)^((b-1)/2)(当b为奇数)

a^b%mod=((a*a)%mod)^b/2%mod;

基础的快速幂模板代码:

(递归写的)

 1 #include<iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 using namespace std;
 5 int mod;
 6 int mat(int a,int b)///a^b,结果对mod取膜,b的值很大的时候
 7 {
 8     int c=1;
 9     if(b==1) return a%mod; ///当b为1时,只剩下最后一个a
10     else if(b&1)  ///b为奇数
11         return mat(a,b-1)*a%mod; ///把单独的a拿出来
12     else ///b为偶数
13         return mat(a*a,b/2)%mod; ///直接相乘,系数除以2
14 }
15 int main()
16 {
17     int a,b;
18     while(~scanf("%d%d%d",&a,&b,&mod))
19         cout<<mat(a,b)<<endl;
20     return 0;
21 }

 

矩阵快速模模板代码:

 1 struct mat
 2 {
 3     int m[10][10];
 4 };
 5 int mod;
 6 
 7 mat mul(mat a,mat b)
 8 {
 9     mat c;
10     int i,j,k;
11     memset(c.m,0,sizeof(c.m));
12     for(i=0; i<10; i++)
13         for(j=0; j<10; j++)
14         {
15             for(k=0; k<10; k++)
16             {
17                 c.m[i][j]+=(a.m[i][k]*b.m[k][j])%mod;
18             }
19             c.m[i][j]%=mod;
20         }
21     return c;
22 }
23 
24 mat product(mat a,int k)
25 {
26     if(k==1) return a;
27     else if(k&1)
28         return mul(product(a,k-1),a);
29     else
30         return product(mul(a,a),k/2);
31 }

 

posted @ 2016-05-30 15:43  lucky_少哖  阅读(244)  评论(0)    收藏  举报