随手练——HDU 5015 矩阵快速幂
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5015

看到这个限时,我就知道这题不简单~~矩阵快速幂,找递推关系

我们假设第一列为:
23
a1
a2
a3
a4
则第二列为:
23*10+3
23*10+3+a1
23*10+3+a1+a2
23*10+3+a1+a2+a3
23*10+3+a1+a2+a3+a4

进一步转化可以得到:

代码:
#include <iostream>
#include <string.h>
using namespace std;
#define N 15
#define mod 10000007 typedef long long LL; int n;
class Matrix{
public:
LL mat[N][N];
Matrix() {
for (int i = ; i < N; i++) {
memset(mat[i], , sizeof(mat[i]));
}
}
Matrix operator*(Matrix b){
Matrix temp;
for (int i = ; i <= n + ; i++){
for (int j = ; j <= n + ; j++){
for (int k = ; k <= n + ; k++){
if (mat[i][k] && b.mat[k][j]){
temp.mat[i][j] = (temp.mat[i][j] + (mat[i][k] % mod * b.mat[k][j] % mod) % mod) % mod;
}
}
}
}
return temp;
}
}; void MatrixMulti(Matrix &M,int m){
Matrix ans;
for (int i = ; i <= n + ; i++)
ans.mat[i][i] = ;
while (m){
if (m & )
ans = ans * M;
m >>= ;
M = M * M;
}
M = ans;
}
Matrix initialize(){
Matrix M;
for (int i = ; i <= n; i++) {
for (int j = ; j <= n + ; j++) {
if (j == )M.mat[i][j] = ;
else if (i >= j)M.mat[i][j] = ;
else if (j == n + )M.mat[i][j] = ;
else M.mat[i][j] = ;
}
}
M.mat[n + ][n + ] = ;
return M;
}
int main(){
int i, m;
while (~scanf("%d%d", &n, &m)){
int a[N];a[] = ;a[n + ] = ;
for (int i = ; i <= n; i++)
scanf("%d", &a[i]);
Matrix M = initialize();
MatrixMulti(M, m);
LL res = ;
for (i = ; i <= n + ; i++)
res = (res + (M.mat[n][i] % mod * a[i] % mod) % mod) % mod;
cout << res << endl;
}
return ;
}
本来是不想直接 mat[N] [N]这样直接开个大数组,时间空间上都浪费,但是这题用指针写起来真的很麻烦!!!而且不知道哪儿写错了,好一会儿我也找不到 -_-,就换成上面这个了。
#include <iostream>
#include <stdio.h>
using namespace std; typedef long long ll;
#define mod 10000007 int** initialize(int *A,int n) {
A[] = ;
for (int i = ; i <= n; i++) {
cin >> A[i];
}
A[n + ] = ;
int **M = new int*[n + ];
for (int i = ; i <= n + ; i++) {
M[i] = new int[n + ];
for (int j = ; j <= n + ; j++) {
if (j == )
M[i][j] = ;
else if (j <= i)M[i][j] = ;
else if (j == n + )M[i][j] = ;
else M[i][j] = ;
}
}
for (int i = ; i <= n + ; i++) {
if (i == n + )M[n + ][i] = ;
else M[n + ][i] = ;
}
return M;
}
void MatrixMulti(int **M1,int **M2,int n,int **M) {
int t[][] = { };
for (int i = ; i <= n + ; i++) {
for (int j = ; j <= n + ; j++) {
for (int k = ; k <= n + ; k++) {
t[i][j] = (t[i][j] + M1[i][k] % mod * M2[k][j] % mod) % mod;
}
}
}
for (int i = ; i <= n + ; i++) {
for (int j = ; j <= n + ; j++) {
M[i][j] = t[i][j];
}
} }
int **getBasicMatrix(int n) {
int **m = new int*[n + ];
for (int i = ; i <= n + ; i++) {
m[i] = new int[n + ];
for (int j = ; j <= n + ; j++) {
if (i == j)m[i][j] = ;
else m[i][j] = ;
}
}
return m;
}
int** MatrixQuickPower(int **M, int n, int m) {
int **res = getBasicMatrix(n);
while (m) {
if (m & )
MatrixMulti(res, M, n, res);
MatrixMulti(M, M, n, M);
m >>= ;
}
return res;
}
int main() {
int n, m;
while (~scanf("%d%d", &n, &m)) {
int res = ;
int *A = new int[n + ];
int **M = initialize(A, n);
M = MatrixQuickPower(M, n, m);
for (int i = ; i <= n + ; i++) {
res = (res + M[n][i] % mod * A[i] % mod) % mod;
}
cout << res << endl;
}
return ;
}
随手练——HDU 5015 矩阵快速幂的更多相关文章
- hdu 5015 矩阵快速幂(可用作模板)
转载:http://blog.csdn.net/wdcjdtc/article/details/39318847 之前各种犯傻 推了好久这个东西.. 后来灵关一闪 就搞定了.. 矩阵的题目,就是构造 ...
- hdu 5015(矩阵快速幂z )
a[i][j] = a[i-1][j] + a[i][j-1] m.特别大,可以计算出第一列,找出规律,构建一个特殊的矩阵,运用快速幂 设矩阵x: 1 0 0 0 ... |10 1 1 1 0 0 ...
- HDU 2855 (矩阵快速幂)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2855 题目大意:求$S(n)=\sum_{k=0}^{n}C_{n}^{k}Fibonacci(k)$ ...
- HDU 4471 矩阵快速幂 Homework
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4471 解题思路,矩阵快速幂····特殊点特殊处理····· 令h为计算某个数最多须知前h个数,于是写 ...
- HDU - 1575——矩阵快速幂问题
HDU - 1575 题目: A为一个方阵,则Tr A表示A的迹(就是主对角线上各项的和),现要求Tr(A^k)%9973. Input数据的第一行是一个T,表示有T组数据. 每组数据的第一行有n( ...
- hdu 1757 (矩阵快速幂) 一个简单的问题 一个简单的开始
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1757 题意不难理解,当x小于10的时候,数列f(x)=x,当x大于等于10的时候f(x) = a0 * ...
- HDU 3802 矩阵快速幂 化简递推式子 加一点点二次剩余知识
求$G(a,b,n,p) = (a^{\frac {p-1}{2}}+1)(b^{\frac{p-1}{2}}+1)[(\sqrt{a} + \sqrt{b})^{2F_n} + (\sqrt{a} ...
- How many ways?? HDU - 2157 矩阵快速幂
题目描述 春天到了, HDU校园里开满了花, 姹紫嫣红, 非常美丽. 葱头是个爱花的人, 看着校花校草竞相开放, 漫步校园, 心情也变得舒畅. 为了多看看这迷人的校园, 葱头决定, 每次上课都走不同的 ...
- HDU 5950 矩阵快速幂
Recursive sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
随机推荐
- SQL Server Profiler小技巧——筛选请求
如果需要转载,请附上本文作者和原文链接:http://www.cnblogs.com/zeusro/p/4016228.html Microsoft SQL Server Profiler 是 SQL ...
- java存储图片
import java.io.File; import java.io.FileOutputStream; import java.io.OutputStream; import java.util. ...
- HTTPS 常见部署问题及解决方案
在最近几年里,我写了很多有关 HTTPS 和 HTTP/2 的文章,涵盖了证书申请.Nginx 编译及配置.性能优化等方方面面.在这些文章的评论中,不少读者提出了各种各样的问题,我的邮箱也经常收到类似 ...
- drupal7,注册成功之后想跳转到指定页面,该怎么破?
1.hook sigup form alter,修改跳转地址 .还没试过 2.安装一下logintoboggan模块,里面有个注册后跳转到哪个页面的设置 这个对于不写代码的是比较方便的方法 3 ...
- Oracle获取session的trace
1. 使用参数SQL_TRACE 下面是官网对此参数的说明 SQL_TRACE Property Description Parameter type Boolean Default value fa ...
- 【转】证书的应用之一 —— TCP&SSL通信实例及协议分析(下)
原文链接 前面两部分分别讲解了如何在.net程序中使用SSL实现安全通信以及SSL的通信过程,并通过抓包工具具体分析了ssl的握手过程,本文通过一个demo来模拟ssl协议,在TCP之上实现自己的安全 ...
- iframe内存释放
Ext 核心开发人员Jack的回答是,TabPanelItem在关闭时并不会对自定义到tab中的元素做特殊处理,这部分工作必须在控件外来完成.另一方面, 相关资料称IE在iframe元素的回收方面存在 ...
- lock free数据结构内存回收技术-hazard pointer
lock free数据结构一般来说拥有比基于lock实现的数据结构更高的性能,但是其实现比基于lock的实现更为复杂,需要处理的难题包括预防ABA问题,内存如何重用和回收等.通常,最简单最有效的处理A ...
- Hibernate的increment主键生成机制带来的问题
最近给学校做的系统,总出现主键插入冲突的问题.主键是通过hibernate自动生成的,设置increment属性,总出现Duplicate entry的错误.搜到解决方案如下: 在网站运行在apach ...
- 如何让chrome浏览器自动翻译
我用的chrome浏览器,最初用的时候浏览器默认自动翻译英文,我感觉很麻烦.所以我选择了一律不翻译.但是我当我想翻译的的时候又不知道怎么操作.一直郁闷到现在.今天我突然发现了一个方法可以让你的浏览器自 ...