矩阵快速幂是基于普通的快速幂的一种扩展,如果不知道的快速幂的请参见http://www.cnblogs.com/Howe-Young/p/4097277.html。二进制这个东西太神奇了,好多优秀的算法都跟他有关系,这里所说的矩阵快速幂就是把原来普通快速幂的数换成了矩阵而已,只不过重载了一下运算符*就可以了,也就是矩阵的乘法,  当然也可以写成函数,标题中的这三个题都是关于矩阵快速幂的基础题。拿来练习练习熟悉矩阵快速幂,然后再做比较难点的,其实矩阵快速幂比较难的是构造矩阵。下面还是那题目直接说话:

hdu1575:

题目大意:求一个矩阵k此方之后主对角线上的元素之和对9973取模

这个题是矩阵快速幂的裸题,直接用就行了。下面是代码

 #include<iostream>
#include <string.h>
#include <stdio.h>
#include <algorithm> using namespace std;
const int N = ;
const int mod = ;
struct Matrix{
int a[N][N];
};
int n;
Matrix operator * (Matrix t1, Matrix t2)//重载运算符 *
{
Matrix c;
memset(c.a, , sizeof(c.a));
//矩阵乘法
for (int k = ; k < n; k++)
{
for (int i = ; i < n; i++)
{
if (t1.a[i][k] <= )
continue;
for (int j = ; j < n; j++)
{
if (t2.a[k][j] <= )
continue;
c.a[i][j] = (c.a[i][j] + t1.a[i][k] * t2.a[k][j]) % mod;
}
}
}
return c;
}
//重载^运算符
Matrix operator ^ (Matrix t, int k)
{
Matrix c;
memset(c.a, , sizeof(c.a));
//初始化矩阵c为单位阵
for (int i = ; i < n; i++)
{
c.a[i][i] = ;
}
//这里用到快速幂
for (; k; k >>= )
{
if (k & )
c = c * t;
t = t * t;
}
return c;
}
int main()
{
int T, k;
cin >> T;
while (T--)
{
cin >> n >> k;
Matrix t1, t2;
for (int i = ; i < n; i++)
{
for (int j = ; j < n; j++)
cin >> t1.a[i][j];
}
t2 = t1 ^ k;
int res = ;
for (int i = ; i < n; i++)
res = (res + t2.a[i][i]) % mod;
cout << res << endl;
} return ;
}

hdu1005:

题目大意:

f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.

给你A, B和n让你求f(n)是多少

这个题就需要稍微构造一下矩阵了

这样的话要求F(n)的话,只需要对求出来F(n-1)就行了,对应的F(n-1)要求出F(n-2),所以题目给了F(1)和F(2),所以乘以他前面的系数矩阵就为【F(3), F(2)】T,再接着成系数矩阵就为【F(4),F(3)】T所以要求F(n)只需要对系数矩阵进行n-2次幂就行了,然后最后要求的结果就是矩阵的第一行第一列的结果,代码如下

 #include<iostream>
#include <cstring>
#include <cstdio>
#include <algorithm> using namespace std;
const int N = ;
const int mod = ;
struct Matrix
{
int mat[N][N];
};
//矩阵乘法(函数的形式)
Matrix Multi(Matrix a, Matrix b)
{
Matrix c;
memset(c.mat, , sizeof(c.mat));
for (int i = ; i < N; i++)
{
for (int j = ; j < N; j++)
{
for (int k = ; k < N; k++)
c.mat[i][j] = (c.mat[i][j] + a.mat[i][k] * b.mat[k][j]) % mod;
}
}
return c;
}
//矩阵快速幂 (函数形式)
Matrix quickMatrixPower(Matrix a, int k)
{
Matrix t;
memset(t.mat, , sizeof(t.mat));
for (int i = ; i < N; i++)
t.mat[i][i] = ;
//快速幂
while (k)
{
if (k & )
t = Multi(t, a);
a = Multi(a, a);
k >>= ;
}
return t;
} int main()
{
long long a, b, n;
while (cin >> a >> b >> n && (a + b + n))
{
Matrix t;
//初始化系数矩阵
t.mat[][] = a;
t.mat[][] = b;
t.mat[][] = ;
t.mat[][] = ;
if (n >= )
{
t = quickMatrixPower(t, n - );
printf("%d\n", (t.mat[][] + t.mat[][]) % mod);
}
else
{
printf("%lld\n", n);
}
} return ;
}

hdu1757

题目大意:

If x < 10 f(x) = x.
If x >= 10 f(x) = a0 * f(x-1) + a1 * f(x-2) + a2 * f(x-3) + …… + a9 * f(x-10);
And ai(0<=i<=9) can only be 0 or 1 .

Now, I will give a0 ~ a9 and two positive integers k and m ,and could you help Lele to caculate f(k)%m.

这个关键还是在于构造矩阵,因为给递推式了,所以矩阵还是比价好构造的,下图是构造的矩阵

推到过程类似于1005,不再赘述,代码如下:

 #include<iostream>
#include <cstdio>
#include <cstring>
#include <algorithm> using namespace std;
const int ori[][] = {, , , , , , , , , };
struct Matrix
{
int str[][];
};
int m;
//矩阵乘法
Matrix operator * (Matrix a, Matrix b)
{
Matrix c;
memset(c.str, , sizeof(c.str));
for (int i = ; i < ; i++)
{
for (int j = ; j < ; j++)
{
for (int k = ; k < ; k++)
c.str[i][j] = (c.str[i][j] + a.str[i][k] * b.str[k][j]) % m;
}
}
return c;
}
//矩阵快速幂
Matrix power (Matrix a, int k)
{
Matrix c;
memset(c.str, , sizeof(c.str));
for (int i = ; i < ; i++)
c.str[i][i] = ;
while (k)
{
if (k & )
c = c * a;
a = a * a;
k >>= ;
}
return c;
}
//最后一步的矩阵乘法
int Multi(Matrix a)
{
Matrix c;
memset(c.str, , sizeof(c.str));
for (int i = ; i < ; i++)
{
for (int j = ; j < ; j++)
{
for (int k = ; k < ; k++)
{
c.str[i][j] = (c.str[i][j] + ori[i][k] * a.str[k][j]) % m;
}
}
}
return c.str[][] % m;
}
int main()
{
int k;
while (cin >> k >> m)
{
Matrix t;
memset(t.str, , sizeof(t.str));
for (int i = ; i < ; i++)
{
cin >> t.str[i][];
for (int j = ; j < ; j++)
if (i + == j)
t.str[i][j] = ;
}
if (k >= )
{
t = power(t, k - );
printf("%d\n", Multi(t));
}
else
{
printf("%d\n", k);
}
} return ;
}

矩阵快速幂(入门) 学习笔记hdu1005, hdu1575, hdu1757的更多相关文章

  1. POJ_Fibonacci POJ_3070(矩阵快速幂入门题,附上自己写的矩阵模板)

    Fibonacci Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10521   Accepted: 7477 Descri ...

  2. HDU 1575 Tr A 【矩阵经典2 矩阵快速幂入门】

    任意门:http://acm.hdu.edu.cn/showproblem.php?pid=1575 Tr A Time Limit: 1000/1000 MS (Java/Others)    Me ...

  3. hdu 1575 Tr A (矩阵快速幂入门题)

    题目 先上一个链接:十个利用矩阵乘法解决的经典题目 这个题目和第二个类似 由于矩阵乘法具有结合律,因此A^4 = A * A * A * A = (A*A) * (A*A) = A^2 * A^2.我 ...

  4. hdu 2604 Queuing(矩阵快速幂乘法)

    Problem Description Queues and Priority Queues are data structures which are known to most computer ...

  5. UVA10870—Recurrences(简单矩阵快速幂)

    题目链接:https://vjudge.net/problem/UVA-10870 题目意思: 给出a1,a2,a3,a4,a5………………ad,然后算下面这个递推式子,简单的矩阵快速幂,裸题,但是第 ...

  6. HDU1005 找规律 or 循环点 or 矩阵快速幂

    http://acm.hdu.edu.cn/showproblem.php?pid=1005 1.一开始就注意到了n的数据范围 <=100 000 000,但是还是用普通的循环做的,自然TLE了 ...

  7. 【原创】SpringBoot & SpringCloud 快速入门学习笔记(完整示例)

    [原创]SpringBoot & SpringCloud 快速入门学习笔记(完整示例) 1月前在系统的学习SpringBoot和SpringCloud,同时整理了快速入门示例,方便能针对每个知 ...

  8. NOI ONLINE 入门组 魔法 矩阵快速幂

    做了这道题我才发现NOI入门组!=NOIP普及组 题目链接 https://www.luogu.com.cn/problem/P6190 题意 给出一张有向图,你有K次机会可以反转一条边的边权,即让它 ...

  9. Sass简单、快速上手_Sass快速入门学习笔记总结

    Sass是世界上最成熟.稳定和强大的专业级css扩展语言 ,除了Sass是css的一种预处理器语言,类似的语言还有Less,Stylus等. 这篇文章关于Sass快速入门学习笔记. 资源网站大全 ht ...

随机推荐

  1. Hive学习之五 《Hive进阶—UDF操作案例》 详解

    hive—UDF操作 udf的操作过程: 在HIVE会话中add 自定义函数的jar文件,然后创建function,继而使用函数. 下面就以下面课题为例: 课题:统计每个活动的PV和UV 一.Java ...

  2. MYSQL主从不同步延迟原理

    1. MySQL数据库主从同步延迟原理.   要说延时原理,得从mysql的数据库主从复制原理说起,mysql的主从复制都是单线程的操作,   主库对所有DDL和DML产生binlog,binlog是 ...

  3. PHP开发套件

    Windows系统下开发 环境配置: PHPstudy----立即下载 开发工具: PHPstorm----立即下载 引用一个注册服务器地址:潘田--phpstorm 2016.1注册码 当然推荐大家 ...

  4. 浅析a标签的4个伪类 .

    关于伪类,大家最熟悉的还是a标签的4个伪类::link        有链接属性时:visited    链接地址已被访问过:active     被用户激活(在鼠标点击与释放之间发生的事件):hov ...

  5. flvplayer.swf flv视频播放器使用方法

    今天由于网页上要加入一个视频文件,就研究了一下flv视频播放器flvplayer.swf      :   关于SewisePlayer  插件 演示例子链接   一.直接在html文件中加载: &l ...

  6. Ant快速入门(二)-----使用Ant工具

    使用Ant非常简单,当正确安装Ant后,只要输入ant或ant.bat即可. 如果运行ant命令时没有指定任何参数,Ant会在当前目录下搜索build.xml文件.如果找到了就以该文件作为生成文件,并 ...

  7. makefile简单介绍

    现在的IDE环境大多是高度集成的,只需要按一个按钮即可完成编译-汇编-链接的工作,但是实际在嵌入式开发的过程中,需要根据实际需要编写个性化的需求,这就需要掌握makefile的写法. 高级IDE的方便 ...

  8. IIS的安装与配置详细图解教程。

    一.这里讲的是在WINDOWS 2003下的IIS组件的安装,至于WINDOWS XP,请看这里:   开始-控制面板-添加或删除程序-添加/删除windows组件   勾选应用程序服务器   勾选I ...

  9. PKUSC2016滚粗记

    Day0 坐飞机来北京,地铁上接到电话,以为是诈骗电话马上就挂了,然后看了一下是北京的电话,赶脚有点不对...打回去居然是报到处老师的电话..走了几个小时,到勺园和其他学校的神犇合住.TAT,感觉第二 ...

  10. h.264 Mode Decision

    Mode Decision(模式选择)决定一个宏块以何种类型进行分割.宏块的分割类型有以下几种: //P_Skip and B_Skip means that nothing need to be e ...