zoukankan      html  css  js  c++  java
  • 快速幂模板

    下面是 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 } 

    下面是矩阵快速幂:

     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
    ");
    64           else if (n <= 4)
    65                   printf("%d
    ",f[n-2]);
    66                else {
    67                       re = quickpow(n - 4);
    68                       printf("%d
    ",(((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 }
  • 相关阅读:
    洛谷P1091 :合唱队形
    NBUT[1026]: 汽车加油问题
    automaticallyAdjustsScrollViewInsets 标签栏不正常显示
    dyld: Symbol not found: _OBJC_CLASS_$_UIBlurEffect
    UIColor -colorWithAlphaComponent
    怎样让外界无法改变自定义view的尺寸大小
    UITableViewCell
    tabBar自定义
    iOS7以后的侧滑返回上一页
    backBarButtonItem无效
  • 原文地址:https://www.cnblogs.com/wangmengmeng/p/4552472.html
Copyright © 2011-2022 走看看