随手练——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 ...
随机推荐
- mysql,存储引擎,事务,锁,慢查询,执行计划分析,sql优化
基础篇:MySql架构与存储引擎 逻辑架构图: 连接层: mysql启动后(可以把mysql类比为一个后台的服务器),等待客户端请求,当请求到来后,mysql建立一个一个线程处理(线程池则分配一个空线 ...
- django 数据库 ORM创建表单是出错
WARNINGS: ?: (mysql.W002) MySQL Strict Mode is not set for database connection 'default' HINT: MySQL ...
- java-接口和抽象类的联系和区别。
接口和抽象类的联系和区别. 一,简单总结 1.抽象类和接口都不能直接实例化,如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象. 2.抽象类要被子类继 ...
- Git 学习之git 起步(一)
起步 本章介绍开始使用 Git 前的相关知识.我们会先了解一些版本控制工具的历史背景,然后试着让 Git 在你的系统上跑起来,直到最后配置好,可以正常开始开发工作.读完本章,你就会明白为什么 Git ...
- Mysql 删除数据表的三种方式详解
用法: 1.当你不再需要该表时, 用 drop; 2.当你仍要保留该表,但要删除所有记录时, 用 truncate; 3.当你要删除部分记录或者有可能会后悔的话, 用 delete. 删除强度:dro ...
- 知识蒸馏(Distillation)
蒸馏神经网络取名为蒸馏(Distill),其实是一个非常形象的过程. 我们把数据结构信息和数据本身当作一个混合物,分布信息通过概率分布被分离出来.首先,T值很大,相当于用很高的温度将关键的分布信息从原 ...
- Android资源文件说明
一. Android资源文件简介 1. Android应用资源的作用 (1) Android项目中文件分类 在Android工程中, 文件主要分为下面几类 : 界面布局文件, Java src源文件, ...
- LOCAL_LISTENER 引起的错误
1. 如果你的LOCAL_LISTENER 指定的是一个别名 比如L2 *.local_listener='L2' 启动实例的时候 会先到 tnsnames.ora 文件里取查找定义名为L2的TNS服 ...
- 【转】数据分析与处理之二(Leveldb 实现原理)
郑重声明:本篇博客是自己学习 Leveldb 实现原理时参考了郎格科技系列博客整理的,原文地址:http://www.samecity.com/blog/Index.asp?SortID=12,只是为 ...
- 设置全局context变量 (显示用户登录名)
比如在每个页面的最上面部分需要显示用户的登录名称,如果不登录则显示为Guest.这部分内容在每个页面都会出现,所以可将该部分内容作为一个公共模板(如userauth.html),如然后在其他模板中进行 ...