hdu 4686 矩阵乘法优化递推关系

这里有一份解题报告

解题报告

这是理论知识:

点我

最主要的是构造乘法矩阵,这个是通过递推关系得到的。

有了它,求数列的第n项可以在log(n)的时间里求出来。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <set>
 5 #include <algorithm>
 6 #include <map>
 7 #include<vector>
 8 #define maxn 1010
 9 #define mod 1000000007
10 using namespace std;
11 typedef long long ll;
12 struct Matrix{
13     ll a[10][10];
14 }res,A,F,ans,temp;
15 Matrix mul(Matrix a,Matrix b){
16     memset(temp.a,0,sizeof(temp.a));
17     for(int i=0;i<5;++i){
18         for(int j=0;j<5;++j){
19             for(int k=0;k<5;++k){
20                 temp.a[i][j]+=(a.a[i][k]*b.a[k][j])%mod;
21                 temp.a[i][j]%=mod;
22              }
23         }
24     }
25     return temp;
26 }
27 void quick_pow(ll k){
28     memset(res.a,0,sizeof(res.a));
29     for(int i=0;i<5;++i)res.a[i][i]=1;
30     while(k){
31         if(k&1)res = mul(res,A);
32         A = mul(A,A);
33         k>>=1;
34     }
35 }
36 int main (){
37     ll  a0,ax,ay;
38     ll b0,bx,by;
39     ll n;
40     ll f1,a1,b1,s0;
41     while(cin>>n){
42         cin>>a0>>ax>>ay;
43         cin>>b0>>bx>>by;
44         if(n==0){printf("0\n");continue;}
45         a1 = ((a0*ax)%mod+ay)%mod;
46         b1 = ((b0*bx)%mod+by)%mod;
47         f1 = (a1*b1)%mod;
48         s0 = (a0*b0)%mod;
49         memset(A.a,0,sizeof(A.a));
50         A.a[0][0]=(ax*bx)%mod;
51         A.a[1][0]=(ax*by)%mod;
52         A.a[2][0]=(ay*bx)%mod;
53         A.a[3][0]=(ay*by)%mod;
54         A.a[1][1]=ax%mod;
55         A.a[3][1]=ay%mod;
56         A.a[2][2]=bx%mod;
57         A.a[3][2]=by%mod;
58         A.a[3][3]=1;
59         A.a[0][4]=1;
60         A.a[4][4]=1;
61         memset(F.a,0,sizeof(F.a));
62         F.a[0][0]=f1%mod;
63         F.a[0][1]=a1%mod;
64         F.a[0][2]=b1%mod;
65         F.a[0][3]=1;
66         F.a[0][4]=s0%mod;
67         quick_pow(n-1);
68         ans=mul(F,res);
69         printf("%lld\n",(ans.a[0][4])%mod);
70     }
71     return 0;
72 }

PS:杭电不支持long long lld 输出,(╯‵□′)╯︵┻━┻

hdu 4686 矩阵乘法优化递推关系

时间: 2024-11-17 11:39:24

hdu 4686 矩阵乘法优化递推关系的相关文章

2014多校第五场1010 || HDU 4920 Matrix multiplication(矩阵乘法优化)

题目链接 题意 : 给你两个n*n的矩阵,然后两个相乘得出结果是多少. 思路 :一开始因为知道会超时所以没敢用最普通的方法做,所以一直在想要怎么处理,没想到鹏哥告诉我们后台数据是随机跑的,所以极端数据是不可能会有的,而我们一开始一直在想极端数据能接受的方法......后来看了鹏哥的做法,就是把是0的地方都跳过就可以了,用矩阵保存前一个非0数的位置是多少.二师兄给我看了一个代码,人家根本没用别的优化,直接将最里层k的循环提到了最外层,然后就AC了,对此我表示无语. 1 #include <cstd

Hdu 4920矩阵乘法(内存访问的讲究)

题目链接 Matrix multiplication Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 2143    Accepted Submission(s): 967 Problem Description Given two matrices A and B of size n×n, find the product of t

用矩阵乘法优化递推

(有关矩阵乘法的基本规则请自行搜索) 引例:求斐波那契数列的第 n 项 mod 1000000007 的值,n <= 1018. 分析:斐波那契数列的递推式为 f(n) = f(n-1)+f(n-2),直接循环求出 f(n) 的时间复杂度是 O(n),对于题目中的数据范围显然无法承受.很明显我们需要对数级别的算法. 由于 f(n) = 1*f(n-1) + 1*f(n-2) 这样的形式很类似于矩阵的乘法,所以我们可以先把这个问题复杂化一下,将递推求解 f(n) 与 f(n-1) 的过程看作是某两

[POJ 3150] Cellular Automaton (矩阵快速幂 + 矩阵乘法优化)

Cellular Automaton Time Limit: 12000MS   Memory Limit: 65536K Total Submissions: 3048   Accepted: 1227 Case Time Limit: 2000MS Description A cellular automaton is a collection of cells on a grid of specified shape that evolves through a number of dis

[BZOJ 1009] [HNOI2008] GT考试 【AC自动机 + 矩阵乘法优化DP】

题目链接:BZOJ - 1009 题目分析 题目要求求出不包含给定字符串的长度为 n 的字符串的数量. 既然这样,应该就是 KMP + DP ,用 f[i][j] 表示长度为 i ,匹配到模式串第 j 位的字符串个数,然后转移就是可以从第 j 位加上一个字符转移到另一个位置. 然而..我并没有写过KMP + DP,我觉得还是写AC自动机+DP比较简单..于是,尽管只有一个模式串,我还是写了AC自动机+DP. 然后就是建出AC自动机,f[i][j] 表示长度为 i ,走到节点 j 的字符串的个数.

形态形成场(矩阵乘法优化dp)

形态形成场(矩阵乘法优化dp) 短信中将会涉及前\(k\)种大写字母,每个大写字母都有一个对应的替换式\(Si\),替换式中只会出现大写字母和数字,比如\(A→BB,B→CC0,C→123\),代表 \(A=12312301231230,B=1231230,C=123\).现在对于给定的替换式,求字符 AA 所代表的串有多少子串满足: 这个子串为单个字符\(0\)或没有前导\(0\). 把这个子串看作一个十进制数后模\(n\)等于\(0\). 答案对\(r\)取模.对于100%的数据,$2 \l

一道简单的递推题(快速幂+矩阵乘法优化+滚动数组)

问题 F: 一道简单的递推题 时间限制: 1 Sec  内存限制: 128 MB提交: 546  解决: 48[提交][状态][讨论版] 题目描述 存在如下递推式: F(n+1)=A1*F(n)+A2*F(n-1)+...+An*F(1) 求第K项的值对1000000007取模的结果 输入 单组测试数据 第一行输入两个整数 n , k (1<=n<=100,n<k<=10000000000) 第二行输入 n 个整数 F(1)   F(2)   ...   F(n) 第三行输入 n

矩阵乘法优化dp

前几天学姐说要给我们考矩乘dp和期望dp...其实我们都(也可能只有我)不会. 那只能现学了,然而学了一天突然通知不考了qwq 矩阵乘法 A矩阵为m*k,B矩阵为k*n,两矩阵相乘则得C矩阵为m*n; for (int i=1;i<=M;++i) for (int j=1;j<=N;++j) for (int k=1;k<=K;++k) c.a[i][j]=(c.a[i][j]+a.a[i][k]*b.a[k][j])%mod; 矩阵乘法模板  时间复杂度为$O(N^3)$,数学一本通上

BZOJ_1009_[HNOI2008]_GT考试_(动态规划+kmp+矩阵乘法优化+快速幂)

描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1009 字符串全部由0~9组成,给出一个串s,求一个长度为n的串,不包含s的种类有多少. 分析 第一眼以为是组合.然后更滑稽的是用错误的方法手算样例居然算出来是对的...我数学是有多差... 题解也是看了好半天,有点难理解. 感觉PoPoQQQ神犇讲得还是比较清楚的.传送门:http://blog.csdn.net/popoqqq/article/details/40188173 我们用dp[