题目链接: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. AutoFac使用方法总结二:事件与依赖循环

         事件 AutoFac支持三种事件:OnActivating,OnActivated,OnRelease.OnActivating在注册组件使用之前会被调用,此时可以替换实现类或者进行一些其他 ...

  2. Spring Boot统一异常处理方案示例

    一.异常处理的原则 1.调用方法的时候返回布尔值来代替返回null,这样可以 NullPointerException.由于空指针是java异常里最恶心的异常. 2. catch块里别不写代码.空ca ...

  3. POJ2251(KB1-B 三维BFS)

    Dungeon Master Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 40872 Accepted: 19936 Desc ...

  4. Git 小记

    感觉用github管理自己平时的一些代码挺方便的,尤其还有各种统计,作为一个码农,就有一种每日签到.累计签到统计的感觉.用github,学习git自然是不可避免的,原先只是用几个 git clone  ...

  5. 爬虫必备—scrapy-redis(分布式爬虫)

    转载自:http://www.cnblogs.com/wupeiqi/articles/6912807.html scrapy-redis是一个基于redis的scrapy组件,通过它可以快速实现简单 ...

  6. git之回退

    1:本地已commit,未push到远程仓库          1)git log: 查看commit日志,获取commit的id 2)  git reset  --hard  commit_id: ...

  7. OG数据预处理

    1.影像处理        ogCalcExtent --srs EPSG:26711 --inputdir D:/software/preprocess/data/bugaboos/ --filet ...

  8. 在RecyclerView列表滚动的时候显示或者隐藏Toolbar

    先看一下效果: 本文将讲解如何实现类似于Google+应用中,当列表滚动的时候,ToolBar(以及悬浮操作按钮)的显示与隐藏(向下滚动隐藏,向上滚动显示),这种效果在Material Design ...

  9. js异步原理与 Promise

    一.Javascript的异步原理 javascript 是单线程语言,所以同一时间只执行一个运算.但有些方法是不能瞬间完成或不可预知何时完成的(如网络请求.settimeout等),为了让它们不对后 ...

  10. sql 字符、数字类型自动转换及运算

    本页面所有内容也可以在oracle 运行,只需要把int.float .decimal 改为 number类型即可 -- 字符串转数字 int 类型 drop table test;create ta ...