快速幂(含二阶方阵类)模板

整体在一个命名空间POW中,使用时应加上POW :: ****

1 namespace POW{
 2     typedef int t; //使用时可将"int"修改为矩阵中存储的数据类型
 3     const t MOD = t(1e9 + 7);//改为快速幂要求的模数
 4     
 5     template <class T>
 6         T powmod(T a, int n, T mod){
 7             T ans = a;
 8             --n;
 9             while(n){
10                 if(n & 1)ans = ans * a % MOD;
11                 a = a * a % MOD;
12                 n >>= 1;
13             }
14             return ans;
15         }
16     //powmod(T a, int n, T mod)
17     
18     struct Mat{
19         t a, b, c, d;//需要时可以改成二维数组并修改下面函数
20         Mat(t w,t x,t y,t z):a(w),b(x),c(y),d(z){}
21         Mat operator *(Mat &B)const{
22             t w, x, y, z;
23             w = (((LL)a * B.a)%MOD + ((LL)b * B.c)%MOD)%MOD;
24             x = (((LL)a * B.b)%MOD + ((LL)b * B.d)%MOD)%MOD;
25             y = (((LL)c * B.a)%MOD + ((LL)d * B.c)%MOD)%MOD;
26             z = (((LL)c * B.b)%MOD + ((LL)d * B.d)%MOD)%MOD;
27             return Mat(w, x, y, z);
28         }
29     };//struct Mat
30     
31 }//namespace POW

时间: 2024-10-23 06:55:06

快速幂(含二阶方阵类)模板的相关文章

快速幂取模算法【模板】

快速幂取模其实是a^b%c,这就是著名的RSA公钥加密的方法,当a,b都很大的时候,直接求是不可取的,所以就用到了快速幂取模. 首先你得明白他的原理,其实是用到了二分的思想,把b按照二进制展开 b = p(n)*2^n  +  p(n-1)*2^(n-1)  +-+   p(1)*2  +  p(0).其中p(i) (0<=i<=n)为 0 或 1. 所以此时a^b =  a^ (p(n)*2^n  +  p(n-1)*2^(n-1)  +...+  p(1)*2  +  p(0))=  a^

【Luogu】P2485计算器(快速幂,exgcd和Bsgs模板)

题目链接 题目描述非常直接,要求你用快速幂解决第一问,exgcd解决第二问,bsgs解决第三问. emmmm于是现学bsgs 第二问让求最小整数解好烦啊…… 假设我们要求得方程$ax+by=c(mod p)$的最小整数解 令$d=gcd(a,b)$ 我们求得一个解$x_0,y_0$使得$ax_0+by_0=d(mod p)$ 然后$x_0*frac{c}{d}$为最小整数解. #include<cstdio> #include<cstdlib> #include<algori

快速幂详解[二进制][十进制]+模板

xxx #include <algorithm> #include <iostream> #include <cstdlib> #include <cstring> #include <string> #include <cstdio> #include <vector> #include <bitset> #include <cmath> #include <ctime> #inclu

poj 3070 Fibonacci (矩阵快速幂乘/模板)

题意:给你一个n,输出Fibonacci (n)%10000的结果 思路:裸矩阵快速幂乘,直接套模板 代码: #include <cstdio> #include <cstring> #include <iostream> using namespace std; typedef long long ll; const int N=2,M=2,P=2; const int MOD=10000; struct Matrix { ll m[N][N]; }; Matrix

【数论】【快速幂】CODEVS 2952 细胞分裂 2

裸快速幂取模,背诵模板用. 1 #include<cstdio> 2 using namespace std; 3 typedef long long LL; 4 LL n=1,m,q; 5 LL Quick_Pow(LL a,LL p,LL MOD) 6 { 7 if(!p) return 1; 8 LL ans=Quick_Pow(a,p>>1,MOD); 9 ans=ans*ans%MOD; 10 if((p&1)==1) ans=ans*a%MOD; 11 retu

省选算法学习-矩阵与矩阵快速幂

0x00 引入 矩阵,顾名思义,就是由数构成的矩形阵列 比如这样的:$\begin{array}{l}\begin{bmatrix}2&3&4\0&7&13\c&\alpha&\sqrt5\end{bmatrix}\\end{array}$ 就是一个3*3的矩阵 矩阵在信息学乃至数学里面的用处都非常广泛,下面就来介绍下它的一些基本知识,以及常用的地方.本文同时还会介绍矩阵快速幂以及快速矩阵乘法. 0x01 何为矩阵 矩阵的定义 其实就是上面那样的啦.....

矩阵快速幂(Matrix_Fast_Power)

一.基础知识(1)矩阵乘法 https://blog.csdn.net/weixin_43272781/article/details/82899737 简单的说矩阵就是二维数组,数存在里面,矩阵乘法的规则:A*B=C 其中c[i][j]为A的第i行与B的第j列对应乘积的和,即: 代码: const int N=100; int c[N][N]; void multi(int a[][N],int b[][N],int n)//n是矩阵大小,n<N { memset(c,0,sizeof c);

HDU1575--Tr A(矩阵快速幂模板)

Tr A Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Description A为一个方阵,则Tr A表示A的迹(就是主对角线上各项的和),现要求Tr(A^k)%9973. Input 数据的第一行是一个T,表示有T组数据. 每组数据的第一行有n(2 <= n <= 10)和k(2 <= k < 10^9)两个数据.接下来有n行,每行有n

HDU-1575-Tr A(矩阵快速幂模板)

Problem Description A为一个方阵,则Tr A表示A的迹(就是主对角线上各项的和),现要求Tr(A^k)%9973. Input 数据的第一行是一个T,表示有T组数据. 每组数据的第一行有n(2 <= n <= 10)和k(2 <= k < 10^9)两个数据.接下来有n行,每行有n个数据,每个数据的范围是[0,9],表示方阵A的内容. Output 对应每组数据,输出Tr(A^k)%9973. Sample Input 2 2 2 1 0 0 1 3 99999