`
Simone_chou
  • 浏览: 192594 次
  • 性别: Icon_minigender_2
  • 来自: 广州
社区版块
存档分类
最新评论

233 Matrix(矩阵快速幂)

    博客分类:
  • HDOJ
阅读更多

233 Matrix

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 553    Accepted Submission(s): 345


Problem Description
In our daily life we often use 233 to express our feelings. Actually, we may say 2333, 23333, or 233333 ... in the same meaning. And here is the question: Suppose we have a matrix called 233 matrix. In the first line, it would be 233, 2333, 23333... (it means a0,1 = 233,a0,2 = 2333,a0,3 = 23333...) Besides, in 233 matrix, we got ai,j = ai-1,j +ai,j-1( i,j ≠ 0). Now you have known a1,0,a2,0,...,an,0, could you tell me an,m in the 233 matrix?
 

 

Input
There are multiple test cases. Please process till EOF.

For each case, the first line contains two postive integers n,m(n ≤ 10,m ≤ 109). The second line contains n integers, a1,0,a2,0,...,an,0(0 ≤ ai,0 < 231).
 

 

Output
For each case, output an,m mod 10000007.
 

 

Sample Input
1 1
1
2 2
0 0
3 7
23 47 16
 

 

Sample Output

 

234
2799
72937
Hint

 

       题意:

       有个 N 行 M 列的矩阵,给出第一行和第一列的元素,根据 a [ i ] [ j ] = a [ i - 1 ] [ j ] + a [ i ] [ j - 1 ] 求出 a [ n ] [ m ] 元素是什么。

 

       思路:

       矩阵快速幂。详细题解明天再补回。记得要用 long long。

 

       AC:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>

using namespace std;

typedef long long ll;
typedef vector<ll> vec;
typedef vector<vec> mat;

const ll MOD = 10000007;

ll n, m;

mat mul (mat a, mat b) {
    mat c(n + 2, vec(n + 2));

    for (ll i = 0; i < n + 2; ++i) {
        for (ll j = 0; j < n + 2; ++j) {
            for (ll k = 0; k < n + 2; ++k) {
                c[i][j] = (c[i][j] + a[i][k] * b[k][j]) % MOD;
            }
        }
    }

    return c;
}

mat pow (mat a) {
    mat b(n + 2, vec(n + 2));
    for (ll i = 0; i < n + 2; ++i) {
        b[i][i] = 1;
    }

    while (m > 0) {
        if (m & 1) b = mul(b, a);
        a = mul(a, a);
        m >>= 1;
    }

    return b;
}

int main () {

    while (~scanf("%I64d%I64d", &n, &m)) {
        mat a(n + 2, vec(n + 2));
        mat b(n + 2, vec(1));

        a[0][0] = 10, a[0][1] = a[1][1] = 1;
        for (ll i = 2; i < n + 2; ++i) {
            for (ll j = 0; j < n + 2; ++j) {
                if (j <= i) a[i][j] = 1;
                if (!j) a[i][j] = 10;
            }
        }

        b[0][0] = 23, b[1][0] = 3;
        for (ll i = 0; i < n; ++i) {
            scanf("%I64d", &b[i + 2][0]);
            b[i + 2][0] %= MOD;
        }

        a = pow(a);
        b = mul(a, b);

        printf("%I64d\n", b[n + 1][0]);
    }

    return 0;
}

 

 

分享到:
评论

相关推荐

    yxy版c++教程 浅谈矩阵快速幂

    矩阵快速幂与C++实现 矩阵快速幂是一种高效的算法,用于计算矩阵的幂运算。该算法基于二进制表示法,通过将幂运算分解为小幂运算,从而大大减少了计算次数。在C++中,矩阵快速幂可以通过模板实现,提高了计算效率。...

    快速幂和矩阵快速幂1

    函数 fmulti(m, n, mod) 实现了快速幂算法,函数 matrix_multiply(matrix_a, matrix_b) 实现了矩阵乘法,函数 get_unit_matrix(n) 实现了单位矩阵的生成,函数 quick_matrix_pow(matrix_a, n) 实现了矩阵快速幂算法...

    浅谈矩阵加速.pdf

    通常,这种技术依赖于矩阵快速幂算法来显著降低计算复杂度。 #### 二、矩阵快速幂简介 矩阵快速幂是指在计算矩阵的高次幂时采用的一种高效算法,其时间复杂度为O(logn),相较于常规逐次相乘的方式,极大地提高了...

    Matrix67_ 十个利用矩阵乘法解决的经典题目1

    5. 利用矩阵乘法求斐波那契数列的第n项模p的值,可以通过构建特定的矩阵模型,如矩阵Fibonacci矩阵,通过矩阵快速幂计算出结果。 这些题目展示了矩阵乘法在处理几何变换、动态规划、序列操作等复杂问题时的高效性和...

    Fibonacci数列三种求和方式

    现在我们将详细讨论如何用递归、迭代和矩阵快速幂三种方法来求解斐波那契数列的和,并分析它们的时间复杂度。 1. **递归实现** 递归是最直观的方式来表示斐波那契数列,但也是效率最低的方法。递归函数通常定义为:...

    斐波那契数列,矩阵连乘法

    在这个代码中,我们首先定义了一个2x2的矩阵类型,然后实现了矩阵乘法和矩阵快速幂函数。`matrixPower`函数使用分治策略,将问题规模减半,直到只剩下一个单位矩阵或者原始矩阵,然后逐层返回结果。`fibonacci`函数...

    Matrix Computations 4th edition_matrixanalysis_

    此外,矩阵的幂和指数运算也是控制理论中的核心概念,通过它们可以研究动态系统的长期行为。 在应用部分,矩阵分析与工程问题的结合尤为突出。例如,书中可能涵盖如何使用SVD(奇异值分解)进行数据压缩和信号处理...

    bch_matrix.rar_ bch_matrix_BCh生成矩阵_bch_bch 生成多项式_bch生成矩阵表

    在压缩包文件"bch_matrix_calculates the G and H matrix from an arbitrary BCH generator polynomial.tar"中,包含的工具或程序很可能是用于计算给定BCH生成多项式下的G和H矩阵的算法或软件。这样的工具对于理解和...

    计算fibbnaci数an模m的值,

    对于效率较高的计算方法,我们可以利用矩阵快速幂(Matrix Exponentiation)来解决这个问题。这是一种高效求解线性递推关系的方法,特别适合于斐波那契数列。斐波那契数列的矩阵形式可以表示为: [ F(n) ] = [ 1 1 ...

    斐波那契数列python斐波那契数列python

    对于大数目的斐波那契数,可以利用矩阵快速幂的算法,复杂度为O(logn),但实现起来相对复杂。 ```python def matrix_multiply(a, b): # 实现2x2矩阵乘法 pass def matrix_power(matrix, n): # 实现矩阵快速...

    Matrix_Quick_Mod.rar_数值算法/人工智能_Visual_C++_

    总之,"Matrix_Quick_Mod.cpp"这个文件很可能是实现矩阵快速幂算法的C++代码示例,它为学习和理解这个高效算法提供了一个实际的起点。通过阅读和理解这个源代码,开发者可以深入掌握矩阵快速幂的实现细节,并将其...

    算法-求递推序列的第N项(51Nod-1126)(包含源程序).rar

    2. **矩阵快速幂(Matrix Exponentiation)**:当递推序列的项数较多,且递推关系为线性形式时,如F(n) = aF(n-1) + bF(n-2),可以利用矩阵快速幂的方法求解。这种方法的时间复杂度可以达到O(log N),比直接动态规划更...

    算法之讲—————— 矩阵

    在算法设计中,矩阵快速幂(Matrix Exponentiation)是一种高效计算矩阵的幂次的方法,尤其在解决动态规划问题时非常有用。例如,若有一个状态转移矩阵,我们可以通过快速幂求出在n步后的状态。该方法利用了矩阵的幂...

    Matrix Cookbook_matrixcookbook_

    最后,《Matrix Cookbook》包含了各种矩阵恒等式和常用技巧,帮助读者解决实际问题时能快速查找并应用相关公式。无论是初学者还是经验丰富的专业人士,都可以从这本书中获益。 总的来说,《Matrix Cookbook》是一本...

    fib.rar_fib.c

    矩阵快速幂算法的基本思想是将指数n转换为其二进制表示,然后通过分治策略进行矩阵的快速乘法。具体步骤如下: 1. 将n转化为二进制表示,例如n=17,其二进制表示为10001。 2. 初始化矩阵M = [[1,1],[1,0]],并设...

    求解特征值Matrix

    3. **幂迭代法**:对于实对称矩阵或者复共轭对称矩阵(如正规矩阵),可以使用幂迭代法快速求解特征值。这种方法基于谱定理,它保证了这些矩阵的特征值是实数,且可以通过幂运算逐步接近。 4. **QR 分解法**:对于...

    Matrix cookbook

    书中还对特殊矩阵进行了分类讨论,包括块矩阵、离散傅里叶变换矩阵、厄米特矩阵和斜厄米特矩阵、幂等矩阵、正交矩阵、半正定矩阵、单元素矩阵、对称矩阵、斜对称矩阵、托普利茨矩阵、转移矩阵以及范德蒙德矩阵等。...

    Simulink MatriX Library (SMXL) - Simulink 中处理矩阵的模块的集合.rar

    3. **矩阵函数**:如指数矩阵、对数矩阵、幂次矩阵、求逆矩阵等,这些高级运算在解决非线性问题时尤为重要。 4. **矩阵属性查询**:检查矩阵的大小、秩、行列式、特征值等,这些信息对于系统分析和稳定性评估至关...

    A lib of Matrix operation for C language. (矩阵运算库--C语言) .zip

    4. **矩阵函数**:如指数矩阵、对数矩阵、幂矩阵等。 5. **内存管理**:库应处理矩阵数据的动态分配和释放,确保有效利用系统资源。 6. **错误处理**:当出现非法操作(如矩阵维度不匹配、未定义的操作等)时,库...

Global site tag (gtag.js) - Google Analytics