快速幂

1//整数的快速幂 m^n  % k 的快速幂:
long long  quickpow(long long   m , long long   n , long long   k){
    long long   ans = 1;
    while(n){
        if(n&1)//如果n是奇数
            ans = (ans * m) % k;
        n = n >> 1;//位运算“右移1类似除2”
        m = (m * m) % k;
    }
    return ans;
}

矩阵快速幂

struct Matrix{
    int n;
    int mat[MAXN][MAXN];

    Matrix operator*(const Matrix& matrix)const{
        Matrix tmp;
        tmp.n = n;
        for(int i = 0 ; i < n ; i++){
            for(int j = 0 ; j < n ; j++){
                tmp.mat[i][j] = 0;
                for(int k = 0 ; k < n ; k++)
                    tmp.mat[i][j] += (mat[i][k]*matrix.mat[k][j]);
            }
        }
        return tmp;
    }
};

Matrix quickPow(Matrix& matrix , int k){
    Matrix ans;
    ans.n = matrix.n;
    for(int i = 0 ; i < ans.n ; i++){
        for(int j = 0 ; j < ans.n ; j++){
            if(i == j)
                ans.mat[i][j] = 1;
            else
                ans.mat[i][j] = 0;
        }
    }

    while(k){
        if(k&1)
            ans = ans*matrix;
        k >>= 1;
        matrix = matrix*matrix;
    }
    return ans;
}

int main(){
    Matrix matrix;
    int cas , k;
    scanf("%d" , &cas);
    while(cas--){
        scanf("%d%d" , &matrix.n , &k);
        for(int i = 0 ; i < matrix.n ; i++)
            for(int j = 0 ; j < matrix.n ; j++)
                scanf("%d" , &matrix.mat[i][j]);
        matrix = quickPow(matrix , k);
    }
    return 0;
}
时间: 2024-10-25 18:59:10

快速幂的相关文章

快速幂取模算法

所谓的快速幂,实际上是快速幂取模的缩写,简单的说,就是快速的求一个幂式的模(余).在程序设计过程中,经常要去求一些大数对于某个数的余数,为了得到更快.计算范围更大的算法,产生了快速幂取模算法.我们先从简单的例子入手:求abmodc 算法1.直接设计这个算法: int ans = 1; for(int i = 1;i<=b;i++) { ans = ans * a; } ans = ans % c; 缺点:这个算法存在着明显的问题,如果a和b过大,很容易就会溢出. 我们先来看看第一个改进方案:在讲

UVa 10229 Modular Fibonacci:矩阵快速幂求斐波那契

10229 - Modular Fibonacci Time limit: 3.000 seconds http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=115&page=show_problem&problem=1170 The Fibonacci numbers (0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, ...) are defin

UVa 374 Big Mod:快速幂取模

374 - Big Mod Time limit: 3.000 seconds http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=310 Calculate for large values of B, P, and M using an efficient algorithm. (That's right, t

矩阵快速幂专题【完结】

第一题 hdu 1757 A Simple Math Problem 点击打开链接 思路:矩阵快速幂 分析: 1 最简单的矩阵快速幂的题目,直接利用矩阵求解即可 点击打开查看代码 第二题 hdu 1575 Tr A 点击打开hdu 1575 思路: 矩阵快速幂 分析: 1 题目给定一个n*n的矩阵要求矩阵的k次幂之后的矩阵的对角线的和 2 矩阵快速幂的裸题 点击打开查看代码 第三题 hdu 2604 Queuing 点击打开hdu 2604 思路: 递推+矩阵快速幂 分析; 1 根据题目的意思,

c++-UVa1374快速幂运算迭代深搜法 ,C++初学者,求优化方法

问题描述 UVa1374快速幂运算迭代深搜法 ,C++初学者,求优化方法 这是我的代码,优化过几次,但是还是很慢很慢,求大神给优化途经,就是在我的代码的进行优化 #include #include #include #include using namespace std; bool search(int,set&,int dep,int); int MAX=1; int tempMax; int main() { sets;int n; for(n=2;n!=1000;++n) { s.cle

PKU 3233 Matrix Power Series(矩阵快速幂 二分)

点击打开链接 Matrix Power Series Time Limit: 3000MS   Memory Limit: 131072K Total Submissions: 19189   Accepted: 8099 Description Given a n × n matrix A and a positive integer k, find the sum S = A + A2 + A3 + - + Ak. Input The input contains exactly one t

C语言快速幂取模算法小结_C 语言

本文实例汇总了C语言实现的快速幂取模算法,是比较常见的算法.分享给大家供大家参考之用.具体如下: 首先,所谓的快速幂,实际上是快速幂取模的缩写,简单的说,就是快速的求一个幂式的模(余).在程序设计过程中,经常要去求一些大数对于某个数的余数,为了得到更快.计算范围更大的算法,产生了快速幂取模算法.我们先从简单的例子入手:求abmodc 算法1.直接设计这个算法: int ans = 1; for(int i = 1;i<=b;i++) { ans = ans * a; } ans = ans %

C++快速幂与大数取模算法示例_C 语言

一.快速幂 其实就是求(a^b)% p ,(其中a,b,p都比较大在int范围内)这类问题. 首先要知道取余的公式: (a*b)%p=(a%p*b%p)%p . 那么幂不就是乘机的累积吗,由此给出代码: int fast(int a,int b,int p) { long long a1=a,t=1; while(b>0) { if(b&1) /如果幂b是奇数多乘一次,因为后边会除2变偶数,(7/2=3) t=(t%p)*(a1%p)%p; a1=(a1%p)*(a1%p)%p; b/=2;

10299 Problem A: Modular Fibonacci(斐波那契的矩阵快速幂)

Problem A: Modular Fibonacci The Fibonacci numbers (0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, ...) are defined by the recurrence: F0 = 0 F1 = 1 Fi = Fi-1 + Fi-2 for i>1 Write a program which calculates Mn = Fn mod 2m for given pair of n and m. 0 n 2147483