首页 > 其他分享 >矩阵快速幂

矩阵快速幂

时间:2023-03-16 10:24:55浏览次数:30  
标签:Node int 矩阵 long ++ second 快速 mod

矩阵快速幂求自幂题目

例:给定A,k,M,求对于指数为 i = (1, ....., k - 1)的A的幂次和对M取模

#include<bits/stdc++.h>

#define int long long
using namespace std;

const int N = 3;

int A, k, M;

void mul(int c[], int a[], int b[][N])
{
	int t[N] = {0};
	for ( int i = 0; i < N; i ++ ) {
		for ( int j = 0; j < N; j ++ ) {
			t[i] = (t[i] + a[j] * b[j][i] % M) % M;
		}
	}
	memcpy(c, t, sizeof t);
}

void mul(int c[][N], int a[][N], int b[][N])
{
	int t[N][N] = {0};
	for ( int i = 0; i < N; i ++ ) {
		for ( int j = 0; j < N; j ++ ) {
			for ( int k = 0; k < N; k ++ ) {
				t[i][j] = (t[i][j] + a[i][k] * a[k][j] % M) % M;
			}
		}
	}
	memcpy(c, t, sizeof t);
}

signed main()
{
	cin >> A >> k >> M;
	int f1[N] = {1, A, 1};
	int b[N][N] = {
		{0, 0, 0},
		{1, A, 1},
		{0, 0, 1}
	};
	k --;
	while (k)
	{
		if (k & 1) mul(f1, f1, b);
		mul(b, b, b);
		k >>= 1;
	}
	cout << f1[2] % M << endl;
	return 0;
}

矩阵快速幂求斐波那契数O(logn)

struct Node{
    int x[2][2];
    Node() {
        x[0][0] = x[0][1] = x[1][0] = 1;
        x[1][1] = 0;
    }
};
 
Node operator *(Node a, Node b)
{
    Node t;
    memset(t.x, 0, sizeof t.x);
    for ( int i = 0; i < 2; i ++ ) {
        for ( int j = 0; j < 2; j ++ ) {
            for ( int k = 0; k < 2; k ++ ) {
                t.x[i][j] = (t.x[i][j] + a.x[i][k] * b.x[k][j]) % mod;
            }
        }
    }
    return t;
}
 
void solve()
{
    int n;
    cin >> n;
    n --;
    Node res, m;
    while (n)
    {
        if (n & 1) res = m * res;
        n >>= 1;
        m = m * m;
    }
    cout << res.x[0][0] << endl;
}

倍增法求斐波那契数(常数比矩阵小)

#define int long long
const int mod = 1e9 + 7;

pair<int, int> fib(int n) {
    if (n == 0) return {0, 1};
    auto p = fib(n >> 1);
    int c = p.first * (2 * p.second - p.first);
    int d = p.first * p.first + p.second * p.second;
    if (n & 1)
        return {(d % mod + mod) % mod, ((c + d) % mod + mod) % mod};
    else
        return {(c % mod + mod) % mod, (d % mod + mod) % mod};
}
//fib(n)函数的返回值记为x,x.second值为第n个斐波那契数

标签:Node,int,矩阵,long,++,second,快速,mod
From: https://www.cnblogs.com/kaiwandao/p/17221295.html

相关文章

  • 如何快速生成一个react的前端项目?
     要快速生成一个React前端项目,可以使用脚手架工具来进行创建。最常用的脚手架工具是CreateReactApp。首先,你需要确保在本地已经安装了Node.js和npm(或者yarn)。......
  • 子矩阵的和 | 二维前缀和
     796.子矩阵的和-AcWing题库   //二维前缀和#include<iostream>usingnamespacestd;intn,m,q,tmp;inta[1010][1010];intmain(){cin>>n>>m>......
  • js快速入门
    前言之前曾学习了html和css,在学js的时候懈怠了,如今大三不得不面对自己web网页做不出来的现实,所以又前来学习web。因为之前js没有怎么学,所以直接从js开始了。不过js需要htm......
  • (17)对称矩阵的cholesky分解
    (17)对称矩阵的cholesky分解补发笔记......
  • 排序算法 之 (快速排序)
    10.3、快速排序算法思想在待排序表[1...n]中任取一个元素pivot作为枢轴(基准,通常去首元素),通过一趟排序将待排序表划分为独立的两部分L[1...k-1]和L[k+1...n],使得L[1...k-......
  • SQL语法快速入门
    本文参考CMU数据库神课15-445中的SQL语法讲解部分SQL数据定义createtabledepartment( dept_namevarchar(20), buildingvarchar(20), budgetnumeric(12,2),......
  • 快速读写文本文件
    packagecom.example.demo.java;importcom.alibaba.fastjson2.JSON;importcom.alibaba.fastjson2.JSONObject;importjava.io.IOException;importjava.net.URI;i......
  • LMG3522R030RQSR 650V 30mΩ GaN FET、TPS92667QPHPRQ1 LED矩阵驱动器、UCC21755QDWRQ
    1、LMG3522R030RQSR650V30mΩGaNFET具有集成式驱动器和保护功能,适用于开关模式电源转换器。LMG3522R030集成了一个硅驱动器,可实现高达150V/ns的开关速度。与分立式硅栅......
  • 快速莫比乌斯/沃尔什变换 (FMT/FWT) 学习笔记
    引入考虑一个基本问题:给定序列\(a_n,b_n\),求出序列\(c_n\),满足\(c_i=\sum_{j\oplusk=i}a_jb_k\),其中\(\oplus\)是一种二元运算符,形如上式的问题一般被称为卷积。......
  • 如何在vi/vim中快速在每行行首或行尾插入相同字符
    在工作生活当中,我们可能会遇到需要在文件的每一行的行首或者行尾插入相同字符的需求,以达到快速编辑、提高效率的目的。例如,我想写一个脚本,能同时编译多个文件。假设你想......