蒟阵乘法

蒟阵乘法,顾名思义,就是蒟蒻的乘法两个蒟阵相乘

公式:\(a\times b,a\)为\(m\times k\)的蒟阵\(,b\)为\(k\times n\)的蒟阵\(,c[i][j]=\sum_{i=1}^{k}a[i][k]\times b[k][j]\)

参考code:

//代码写得很丑
long long mod,maxn;
struct node
{
    long long a[maxn][maxn];
    node operator+(const node &u)const{node v;for(int i=0;i<maxn;i++)for(int j=0;j<maxn;j++){v.a[i][j]=u.a[i][j]+a[i][j];if(v.a[i][j]>=mod)v.a[i][j]-=mod;}return v;}//请忽略这一行
    node operator*(const node &u)const{node v;for(int i=0;i<maxn;i++)for(int j=0;j<maxn;j++){v.a[i][j]=0;for(int k=0;k<maxn;k++)v.a[i][j]=(v.a[i][j]+a[i][k]*u.a[k][j])%mod;}return v;}
};

蒟阵乘法有结合律,但没有交换律

蒟阵快速幂:利用蒟阵的结合律,减少所用时间

实现类似普通的快速幂,时间复杂度:\(O(\log_{2}n)\)

代码:

void ksm(long long n)
{
    while(n)
    {
        if(n&1)ans=ans*a;//a,ans为蒟阵
        a=a*a;
        n>>=1;
    }return;//答案存储在ans里
}

例:斐波拉契数列P1962

\(f[1]=f[2]=1,f[n]=f[n-1]+f[n-2],\)求\(f[n]\;\;mod\;\;1000000007(1\text{e}9+7)\)的值

过程:可以用一个\(1\times2\)的蒟阵来存储\(f[n-1]\)与\(f[n-2]\)

于是由递推式得\((f[n-1],f[n-2])\times\lgroup_{1,0}^{1,1}\rgroup=(f[n],f[n-1])\)

代码:

#include<stdio.h>
const long long mod=1000000007;
struct node
{
    long long a[2][2];
    node operator+(const node &u)const{node v;for(int i=0;i<=1;i++)for(int j=0;j<=1;j++){v.a[i][j]=u.a[i][j]+a[i][j];if(v.a[i][j]>=mod)v.a[i][j]-=mod;}return v;}
    node operator*(const node &u)const{node v;for(int i=0;i<=1;i++)for(int j=0;j<=1;j++){v.a[i][j]=0;for(int k=0;k<=1;k++)v.a[i][j]=(v.a[i][j]+a[i][k]*u.a[k][j])%mod;}return v;}
}a,ans;
long long ksm(int m)
{
    while(m)
    {
        if(m&1)ans=ans*a;
        a=a*a;
        m>>=1;
    }
    return ans.a[0][0];
}
int n;
int main()
{
    a.a[0][0]=1;a.a[0][1]=1;
    a.a[1][0]=0;a.a[1][1]=0;
    ans.a[0][0]=1;ans.a[0][1]=1;
    ans.a[1][0]=1;ans.a[1][1]=0;
    scanf("%d",&n);
    if(n>2)printf("%lld\n",ksm(n-2));
    else printf("%d\n",1);
}

原文地址:https://www.cnblogs.com/ztc03/p/10498502.html

时间: 2024-10-09 13:56:39

蒟阵乘法的相关文章

蒟阵P3390 【模板】矩阵快速幂

代码如下: 1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cmath> 5 #include<cstring> 6 #include<string> 7 #include<algorithm> 8 #include<time.h> 9 using namespace std; 10 #define mod 10000

Chang&#39;an(YY&#39;s problem-矩阵乘法)

矩阵乘法 #include <bits/stdc++.h> #define LL long long #define MOD 1000000007 using namespace std; LL MMM(int a, int b) { return ((a%MOD)*(LL)(b%MOD))%MOD; } LL x[4], a[4], t[4]; LL* mult(LL *a,LL *b) { x[0]=MMM(a[0],b[0])+MMM(a[1],b[2]); x[0]%=MOD; x[1

poj-3744-Scout YYF I-矩阵乘法

f[i]=f[i-1]*p+f[i-2]*(1-p); 正好可以用矩阵加速.... #include<stdio.h> #include<string.h> #include<algorithm> #include<iostream> #include<vector> using namespace std; struct matr { double mat[3][3]; friend matr operator *(const matr a,c

BZOJ-2326-数学作业-HNOI2011-矩阵乘法

描述 分析 如果用 f[i] 表示 i 时 Concatenate(1 .. i) Mod M 的值, 如果 i 是个 k 位数, 则 f[i+1] = f[i] * (10^k) + i+1, (i != 10^k-1) 所以可以建立一个按 i 的位数分段的动态规划解法 -> f[n] n ≤ 10^18, 所以要用矩阵乘法优化 然后就是矩阵的选取了, 我首先考虑的 2×2 的矩阵能不能解决, 发现不能于是看了一下 HZWER 开的数组大小是4, 所以应该是 3×3 的矩阵了. 之所以 2×2

Codevs1732-矩阵乘法快速幂

Codevs1732,这道题要求求fibonacci数列的第N项,1 <= n <= 100000000000000,非常大,普通的O(N)的求法肯定会TLE,所以我们需要用的快速幂矩阵乘法,在O(logN)的时间内即可求出.矩阵的乘法是这样的:我们定义X(i,j)表示矩阵第i行第j列的元素.我们定义两个矩阵A和B,A有n行m列,B有m行p列,则此时矩阵A和B的乘法有定义(当且仅当A的列数=B的行数时,A*B有定义):A*B=C,矩阵C为n行p列 ,C(i,j)=Σ(A(i,k)*B(k,j)

解题(JuZhengCalculate-矩阵乘法计算量)

题目描述 矩阵乘法的运算量与矩阵乘法的顺序强相关. 例如: A是一个50×10的矩阵,B是10×20的矩阵,C是20×5的矩阵 计算A*B*C有两种顺序:((AB)C)或者(A(BC)),前者需要计算15000次乘法,后者只需要3500次. 编写程序计算不同的计算顺序需要进行的乘法次数 输入描述: 输入多行,先输入要计算乘法的矩阵个数n,每个矩阵的行数,列数,总共2n的数,最后输入要计算的法则 输出描述: 输出需要进行的乘法次数 示例1 输入 3 50 10 10 20 20 5 (A(BC))

BZOJ-1875-HH去散步-SDOI2009-矩阵乘法

描述 无向图边长均为1, 求从给定地点A走到给定地点B共有多少条长度为 t 的路径(不能连续走重复的边). 模45989. 分析 f[i][k] : 当走到边 i 的终点的时候路径长度为 j 的方案数量 f[i][k] : 可以由 f[j][k-1] 转移来的条件是边 j 的终点是i的起点 那么就可以构造矩阵来解了... 不用矩阵是不是也能解? 代码

HDU 5318(The Goddess Of The Moon-矩阵乘法)[Template:矩阵]

The Goddess Of The Moon Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 1086    Accepted Submission(s): 489 Problem Description Chang'e (嫦娥) is a well-known character in Chinese ancient mytholo

tensorflow-矩阵乘法

#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Created on Wed Dec 12 18:18:06 2018 @author: myhaspl """ import tensorflow as tf w1=tf.Variable(tf.random_normal([2,5],mean=1.0,stddev=1.0)) w2=tf.Variable(tf.random_normal([