快速幂模板

来源:http://www.cppblog.com/acronix/archive/2010/08/23/124470.aspx?opt=admin

 

下面是 m^n  % k 的快速幂:

复制代码
 1 // m^n % k
 2 int quickpow(int m,int n,int k)
 3 {
 4     int b = 1;
 5     while (n > 0)
 6     {
 7           if (n & 1)
 8              b = (b*m)%k;
 9           n = n >> 1 ;
10           m = (m*m)%k;
11     }
12     return b;
13 } 
复制代码

 

快速幂原理讲解:http://www.cnblogs.com/CXCXCXC/p/4641812.html

 

下面是矩阵快速幂:

复制代码
 1 //HOJ 3493
 2 /*===================================*/
 3 || 快速幂(quickpow)模板 
 4 || P 为等比,I 为单位矩阵
 5 || MAX 要初始化!!!!
 6 ||
 7 /*===================================*/
 8 /*****************************************************/
 9 #include <cstdio>
10 const int MAX = 3;
11 
12 typedef  struct{
13         int  m[MAX][MAX];
14 }  Matrix;
15 
16 Matrix P = {5,-7,4,
17             1,0,0,
18             0,1,0,
19            };
20 
21 Matrix I = {1,0,0,
22             0,1,0,
23             0,0,1,
24            };
25            
26 Matrix matrixmul(Matrix a,Matrix b) //矩阵乘法
27 {
28        int i,j,k;
29        Matrix c;
30        for (i = 0 ; i < MAX; i++)
31            for (j = 0; j < MAX;j++)
32              {
33                  c.m[i][j] = 0;
34                  for (k = 0; k < MAX; k++)
35                      c.m[i][j] += (a.m[i][k] * b.m[k][j])%9997;
36                  c.m[i][j] %= 9997;
37              }
38        return c;
39 }
40           
41 Matrix quickpow(long long n)
42 {
43        Matrix m = P, b = I;
44        while (n >= 1)
45        {
46              if (n & 1)
47                 b = matrixmul(b,m);
48              n = n >> 1;
49              m = matrixmul(m,m);
50        }
51        return b;
52 }
53                /*************************************/
54 
55 int main()
56 {
57     Matrix re;
58     int f[3] = {2,6,19};
59     long long n;
60     while (scanf("%I64d",&n) && n != 0)
61     {
62           if (n == 1)
63              printf("1\n");
64           else if (n <= 4)
65                   printf("%d\n",f[n-2]);
66                else {
67                       re = quickpow(n - 4);
68                       printf("%d\n",(((re.m[0][0]*f[2]) 
69                              + (re.m[0][1]*f[1]) + (re.m[0][2]*f[0])) %9997 + 9997) % 9997);
70                       }
71     }
72     return 0;
73 }
View Code
复制代码

 

OJ题目:codevs 1497 取余运算

题目描述 Description

输入bpk的值,编程计算bp mod k的值。其中的bpk*k为长整型数(2^31范围内)。

输入描述 Input Description

b p k 

输出描述 Output Description

输出b^p mod k=?

=左右没有空格

样例输入 Sample Input

2  10  9

样例输出 Sample Output

2^10 mod 9=7

超时的代码:

复制代码
 1 #include <iostream>
 2 using namespace std;
 3 long long i,n=0,m=0,l=0,ans=0;
 4 int main(void)
 5 {
 6     ans=1;
 7     cin>>n>>m>>l;
 8        for (i=1;i<=m;i++)
 9            ans=(ans*n)%l;
10     cout<<n<<'^'<<m<<" mod "<<l<<'='<<ans;
11     return 0;
12 }
复制代码

AC代码:(注意类型要用long long)

复制代码
 1 #include <stdio.h>
 2 long long quickpow(long long m,long long n,long long k);
 3 int main(int argc, char *argv[])
 4 {
 5     long long b,p,k;
 6     scanf("%lld%lld%lld",&b,&p,&k);
 7     printf("%lld^%lld mod %lld=%lld",b,p,k,quickpow(b,p,k));
 8     return 0;
 9 }
10 // m^n % k
11 long long quickpow(long long m,long long n,long long k)
12 {
13     long long ans = 1;
14     while (n > 0)
15     {
16           if (n & 1)
17              ans = (ans*m)%k;
18           n = n >> 1 ;
19           m = (m*m)%k;
20     }
21     return ans;
22 }
复制代码

 

posted on   华山青竹  阅读(361)  评论(0编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?

导航

< 2025年3月 >
23 24 25 26 27 28 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 1 2 3 4 5
点击右上角即可分享
微信分享提示