题目链接: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 矩阵快速幂的更多相关文章

  1. hdu 5015 矩阵快速幂(可用作模板)

    转载:http://blog.csdn.net/wdcjdtc/article/details/39318847 之前各种犯傻 推了好久这个东西.. 后来灵关一闪  就搞定了.. 矩阵的题目,就是构造 ...

  2. 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 ...

  3. HDU 2855 (矩阵快速幂)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2855 题目大意:求$S(n)=\sum_{k=0}^{n}C_{n}^{k}Fibonacci(k)$ ...

  4. HDU 4471 矩阵快速幂 Homework

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4471 解题思路,矩阵快速幂····特殊点特殊处理····· 令h为计算某个数最多须知前h个数,于是写 ...

  5. HDU - 1575——矩阵快速幂问题

    HDU - 1575 题目: A为一个方阵,则Tr A表示A的迹(就是主对角线上各项的和),现要求Tr(A^k)%9973.  Input数据的第一行是一个T,表示有T组数据. 每组数据的第一行有n( ...

  6. hdu 1757 (矩阵快速幂) 一个简单的问题 一个简单的开始

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1757 题意不难理解,当x小于10的时候,数列f(x)=x,当x大于等于10的时候f(x) = a0 * ...

  7. 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} ...

  8. How many ways?? HDU - 2157 矩阵快速幂

    题目描述 春天到了, HDU校园里开满了花, 姹紫嫣红, 非常美丽. 葱头是个爱花的人, 看着校花校草竞相开放, 漫步校园, 心情也变得舒畅. 为了多看看这迷人的校园, 葱头决定, 每次上课都走不同的 ...

  9. HDU 5950 矩阵快速幂

    Recursive sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

随机推荐

  1. 【转】通过CountDownLatch提升请求处理速度

    countdownlatch是java多线程包concurrent里的一个常见工具类,通过使用它可以借助线程能力极大提升处理响应速度,且实现方式非常优雅.今天我们用一个实际案例和大家来讲解一下如何使用 ...

  2. nginx为什么性能这么优越?

    Nginx (“engine x”) 是一个高性能的 HTTP 和 反向代理 服务器 ,也是一个 IMAP/POP3/SMTP 代理 服务器 . Nginx 是由 Igor Sysoev 为俄罗斯访问 ...

  3. RabbitMQ--学习资源汇

    1.RabbitMQ 实战教程 文集(alibaba) 2.RabbitMQ从入门到精通(9篇系列博文 )(anzhsoft2008 ) 3. RabbitMQ目录(nick's blog)   使用 ...

  4. JXU1NDRBJXU0RTJBJXU1MjJCJXU1NDI3

    U2FsdGVkX19f62S3+iSZxxJBADqNOfYV6/XumpnG7VwzMlQz7T7SaFsjyQx9d4PWAYQwtmgr4T9wDGKnKJCrR0veUEul6Uj4mEkN ...

  5. java:tag 自定义标签应用

    一,tag类 1.1 TagMy标签类,格式化当前日期并输出 package com.dkt.tag; import java.io.IOException; import java.text.Sim ...

  6. 阿里云服务器被他人通过SSH暴力破解后的安全加固

    背景说明:我登录阿里云服务器控制台时,收到几条安全警告信息. 从图中可以知道,对方的IP地址是47.97.68.118,通过SSH登录方式,登录时用我服务器里的admin用户,然后用穷举法暴力破解ad ...

  7. bzoj3167 [Heoi2013]Sao

    传送门 这题神坑啊……明明是你菜 首先大家都知道原题等价于给每个点分配一个$1$~$n$且两两不同的权值,同时还需要满足一些大于/小于关系的方案数. 先看一眼数据范围,既然写明了$n\le 1000$ ...

  8. php5.5过渡--mysql连接

    以前: // $conn=mysql_connect("localhost","root","");// $db=mysql_select_ ...

  9. div实现返回符,倒三角,椭圆+小知识收集

    收集: 1,返回符(伪类元素): .back:before {content: "";width: .3rem;height: .3rem;border-left: .04rem ...

  10. TCP报文发送工具

    该工具用于向Socket服务端发送XML报文,软件功能界面如下图所示: 配置好IP和端口后,单击"载入报文文件"按钮,在文件选择对话框中选择报文文件,如图: 报文文件打开后,可在右 ...