码迷,mamicode.com
首页 > 其他好文 > 详细

快速幂

时间:2018-08-28 22:39:47      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:math   函数实现   type   pen   rac   struct   name   quick   turn   

整数的快速幂

long long quick_pow(long long a,long long n)
{
    long long ret;
    while(n)
    {
        if(n&1)ret=ret*a;
        a=a*a;
        n>>=1;
    }
    return ret;
}

矩阵快速幂

由于求矩阵的幂次的时候往往也会需要求数的快速幂,所以这里用模板函数实现。设矩阵在域(环)\(Z_M\)中运算,数在环(域)\(Z_N\)中运算。

注意数据类型都是long long,输入输出时须使用%lld
环中做除法:\(\frac{a}{b}\%M=\frac{a\%bM}{b}\)

struct matrix
{
    long long a,b,c,d;
    matrix(){}
    matrix(long long m,long long n,long long p,long long q):a(m),b(n),c(p),d(q){}
    matrix(long long x):a(x),b(0),c(0),d(x){}
};
matrix solve(matrix A,matrix B)
{
    matrix ret;
    ret.a=(A.a*B.a+A.b*B.c)%M;
    ret.b=(A.a*B.b+A.b*B.d)%M;
    ret.c=(A.c*B.a+A.d*B.c)%M;
    ret.d=(A.c*B.b+A.d*B.d)%M;
    return ret;
}
long long solve(long long x,long long y)
{
    return x*y%N;
}
template<typename T>
T quick_pow(T a,long long n)
{
    T ret(1);
    while(n)
    {
        if(n&1)ret=solve(ret,a);
        a=solve(a,a);
        n>>=1;
    }
    return ret;
}

快速幂

标签:math   函数实现   type   pen   rac   struct   name   quick   turn   

原文地址:https://www.cnblogs.com/maoruimas/p/9551301.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!