HDU 5015
http://acm.hdu.edu.cn/showproblem.php?pid=5015
矩阵是表示状态转移的利器
这题m很大,n非常小,所以开始的思考角度是能否从当前列推出下一列。有了这个角度,矩阵构造是很简单的
#include <iostream>
#include <cstdio>
#include <cstring> using namespace std; typedef __int64 LL; #define MOD 10000007 #define Mat 15 //矩阵大小 struct mat{//矩阵结构体,a表示内容,r行c列 矩阵从1开始
LL a[Mat][Mat];
int r, c;
mat() {
r = c = ;
memset(a, , sizeof(a));
}
}; void print(mat m) {
//printf("%d\n", m.size);
for(int i = ; i < m.r; i++) {
for(int j = ; j < m.c; j++) printf("%d ", m.a[i][j]);
putchar('\n');
}
} mat mul(mat m1, mat m2, int mod) {
mat ans = mat();
ans.r = m1.r, ans.c = m2.c;
for(int i = ; i <= m1.r; i++)
for(int j = ; j <= m2.r; j++)
if(m1.a[i][j])
for(int k = ; k <= m2.c; k++)
ans.a[i][k] = (ans.a[i][k] + m1.a[i][j] * m2.a[j][k]) % mod;
return ans;
} mat quickmul(mat m, int n, int mod) {
mat ans = mat();
for(int i = ; i <= m.r; i++) ans.a[i][i] = ;
ans.r = m.r, ans.c = m.c;
while(n) {
if(n & ) ans = mul(m, ans, mod);
m = mul(m, m, mod);
n >>= ;
}
return ans;
} /*
初始化ans矩阵
mat ans = mat();
ans.r = R, ans.c = C;
ans = quickmul(ans, n, mod);
*/ int main() {
int n, m;
while(~scanf("%d%d", &n, &m)) {
int a = n + ;
mat A = mat();
A.r = , A.c = a;
A.a[][] = , A.a[][a] = ;
for(int i = ; i <= n+; i++)
scanf("%d", &A.a[][i]);
mat M = mat();
M.r = M.c = a;
for(int i = ; i < a; i++)
M.a[][i] = ;
for(int i = ; i <= a; i++)
M.a[a][i] = ;
for(int i = ; i < a; i++) {
for(int j = ; j < a; j++) {
if(j >= i) M.a[i][j] = ;
}
}
printf("%d\n", mul(A, quickmul(M, m, MOD), MOD).a[][n+]);
}
return ;
}
HDU 5015的更多相关文章
- hdu 5015 233 Matrix(构造矩阵)
http://acm.hdu.edu.cn/showproblem.php?pid=5015 由于是个二维的递推式,当时没有想到能够这样构造矩阵.从列上看,当前这一列都是由前一列递推得到.依据这一点来 ...
- hdu 5015 233矩阵快速幂
http://acm.hdu.edu.cn/showproblem.php?pid=5015 需要构造一个 n+2 维的矩阵. 就是要增加一维去维护2333这样的序列. 可以发现 2333 = 233 ...
- 随手练——HDU 5015 矩阵快速幂
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5015 看到这个限时,我就知道这题不简单~~矩阵快速幂,找递推关系 我们假设第一列为: 23 a1 a2 ...
- 【HDU 5015】233 Matrix
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5015 [算法] 矩阵乘法 [代码] #include<bits/stdc++.h> u ...
- HDU 5015 233 Matrix --矩阵快速幂
题意:给出矩阵的第0行(233,2333,23333,...)和第0列a1,a2,...an(n<=10,m<=10^9),给出式子: A[i][j] = A[i-1][j] + A[i] ...
- HDU 5015 233 Matrix
题意:给定一个矩阵的第0列的第1到n个数,第一行第1个数开始每个数分别为233, 2333........,求第n行的第m个数. 分析: 其实也没那么难,自己想了半天还没往对的方向想,m最大1e9,应 ...
- hdu 5015 大数量反复类似操作问题/ 矩阵高速幂
题意: 给一个矩阵a,第一行是 0. 233,2333,23333.....第一列读入.列数<10^9.行数<=10. 先转化操作: m是大数量.必定每次向前推一列.就是每次乘一个矩阵T. ...
- 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 ...
- Spring-1-I 233 Matrix(HDU 5015)解题报告及测试数据
233 Matrix Time Limit:5000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Descript ...
随机推荐
- AntiXSS v4.0中Sanitizer.GetSafeHtmlFragment等方法将部分汉字编码为乱码的解决方案
AntiXSS v4.0中Sanitizer.GetSafeHtmlFragment等方法将部分汉字编码为乱码的解决方案 以下代码为asp.net环境下,c#语言编写的解决方案.数据用Dictiona ...
- javascript实现列表的点击展开折叠
<script> window.onload = function() { //要折叠的区域 var catalog = document.getElementById("div ...
- 关于jquery中html()、text()、val()的区别
1. .html()用为读取和修改元素的HTML标签 对应js中的innerHTML .html()是用来读取元素的HTML内容(包括其Html标签),.html()方法使用在多个元素上时,只读 ...
- mysql创建用户及授权相关命令
移步: https://zhidao.baidu.com/question/1576368583039067980.html
- oracle 递归应用(挺复杂的)
最近做数据过滤觉得很有必要记录下整个过程,说不定下次就不知道了. 废话不多说开始: 表结构: 企业表(自关联,采用树的形式记录分子公司) 区域表(自关联,采用树的形式记录省/市/县/乡,数据量大) 公 ...
- Spring(3)
一.Spring容器 Spring 提供了两种类型的IOC容器(后面还会讲到AOP容器): (1)BeanFactory:IOC容器的基本实现,是Spring框架的基础设施,面向Spring的本身 ( ...
- PO VO DAO DTO BO TO概念与区别(转)
O/R Mapping 是 Object Relational Mapping(对象关系映射)的缩写.通俗点讲,就是将对象与关系数据库绑定,用对象来表示关系数据.在O/R Mapping的世界里,有两 ...
- css初始化
Css初始化代码: *{padding:0px;margin:0px;} body{font-size:12px;font-family: "宋体",Arial Black;tex ...
- centos添加硬盘
fdisk -l ## 这里是查看目前系统上有几块硬盘 Disk /dev/sda: 36.4 GB, 36401479680 bytes 255 heads, 63 sectors/track, 4 ...
- SSZIPArchive的相关用法截图