UVA10870—Recurrences(简单矩阵快速幂)

题目链接:https://vjudge.net/problem/UVA-10870

题目意思:

给出a1,a2,a3,a4,a5………………ad,然后算下面这个递推式子,简单的矩阵快速幂,裸题,但是第一个次遇到了矩阵大小不确定的矩阵快速幂,而且在这道题里面第一次明白了如何构造矩阵。算是矩阵快速幂的学习的一个小里程碑吧。

f(n) = a1 *f(n - 1) + a2 *f(n - 2) + a3 *f(n - 3) + … + ad* f(n - d),  n > d.求f(n)

代码:

 1 //Author: xiaowuga
 2 #include <bits/stdc++.h>
 3 #define maxx INT_MAX
 4 #define minn INT_MIN
 5 #define inf 0x3f3f3f3f
 6 using namespace std;
 7 typedef long long ll;
 8 ll n;
 9 ll MOD;
10 struct Matrix{
11     ll mat[101][101];
12     void clear(){
13         memset(mat,0,sizeof(mat));
14     }
15     Matrix operator * (const Matrix & m) const{
16         Matrix tmp;
17         tmp.clear();
18         for(int i=0;i<n;i++)
19             for(int k=0;k<n;k++){
20                 if(mat[i][k]==0) continue;
21                 for(int j=0;j<n;j++){
22                     tmp.mat[i][j]+=mat[i][k]*m.mat[k][j]%MOD;
23                     tmp.mat[i][j]%=MOD;
24                 }
25             }
26         return tmp;
27     }
28 };
29 Matrix POW(Matrix &m,int k){
30     Matrix ans;
31     memset(ans.mat,0,sizeof(ans.mat));
32     for(int i=0;i<n;i++) ans.mat[i][i]=1;
33     while(k){
34         if(k&1) ans=ans*m;
35         k/=2;
36         m=m*m;
37     }
38     return ans;
39 }
40 int main() {
41     ios::sync_with_stdio(false);cin.tie(0);
42     int T;
43     while(cin>>n>>T>>MOD&&n&&T&&MOD){
44        Matrix m;
45        m.clear();
46        for(int i=0;i<n;i++){
47            cin>>m.mat[0][i];
48            m.mat[0][i]%=MOD;
49        }
50        ll f[101];
51        for(int i=0;i<n;i++){
52            cin>>f[i];
53        }
54        for(int i=1;i<n;i++){
55            m.mat[i][i-1]=1;
56        }
57        Matrix ans=POW(m,T-n);
58        ll sum=0;
59        for(int i=0;i<n;i++){
60             sum=sum+ans.mat[0][i]*f[n-1-i]%MOD;
61             sum%=MOD;
62        }
63        cout<<sum<<endl;
64     }
65     return 0;
66 }

时间: 2024-10-13 02:39:02

UVA10870—Recurrences(简单矩阵快速幂)的相关文章

Uva10870 Recurrences(矩阵快速幂)

题目 考虑递推关系式\(f(n)=a1*f(n-1)+a2*f(n-2)+....+ad*f(n-d)\),计算f(n)%m [输入格式] 输入包含多组测试数据.每组数据第一行为三个整数d,n,m(1<=d<=15,1<=n<=2^31-1,1<=m<=46340).第二行包含d个非负整数a1,a2.....ad.第三行为d个非负整数f(1),f(2).....f(d).这些数字均不超过2^31-1.输入结束的标志是d=n=m=0. [输出格式] 对于每组数据,输出f(

HDU3306Another kind of Fibonacci(简单矩阵快速幂)

哎,本来是想学学矩阵构造的方法的,,突然发现自己不用看直接就会yy构造... 看下右边有什么.. 题目地址:Another kind of Fibonacci AC代码: #include<iostream> #include<cstdio> #include<cstring> #include<string> using namespace std; const int mod=10007; int p[4][4],a[4][4],tmp[4][4]; i

ZOJ 2853 Evolution 【简单矩阵快速幂】

这道题目第二次看的时候才彻底理解了是什么意思 把题目转化为数学模型分析后就是 有一个初始序列, 有一个进化率矩阵 求的是初始序列 与进化率矩阵进行 m 次运算后, 初始序列最后一位的答案 那么显然,可以对进化率矩阵进行快速幂计算 Example Let's assume that P(0, 1) = P(1, 2) = 1, and at the beginning of a sub-process, the populations of 0, 1, 2 are 40, 20 and 10 re

Codeforces - 185A 简单矩阵快速幂

题意:求第n个三角形内部的上三角形个数 对每个三角形分别维护上下三角形个数,记为\(dp[1][i],dp[2][i]\) 规律很明显是 \(dp[1][i+1]=3*dp[1][i]+dp[2][i]\) \(dp[2][i+1]=3*dp[2][i]+dp[1][i]\) 别忘了快速幂里也要long long,白送了个TLE /*H E A D*/ inline ll mod(ll a){return a%MOD;} struct Matrix{ ll mt[5][5],r,c; void

HDU - 1005 Number Sequence(简单矩阵快速幂)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1005 题意:f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7. 就是这道题目,然而找了一晚上的错误 \("▔□▔)/\("▔□▔)/\("▔□▔)/. 1 #include <iostream> 2 #include <cstring> 3 using namespace std;

hdu------(1757)A Simple Math Problem(简单矩阵快速幂)

A Simple Math Problem Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2791    Accepted Submission(s): 1659 Problem Description Lele now is thinking about a simple function f(x). If x < 10 f(x) =

垒骰子(矩阵快速幂)

题目描述: 赌圣atm晚年迷恋上了垒骰子,就是把骰子一个垒在另一个上边,不能歪歪扭扭,要垒成方柱体. 经过长期观察,atm 发现了稳定骰子的奥秘:有些数字的面贴着会互相排斥! 我们先来规范一下骰子:1 的对面是 4,2 的对面是 5,3 的对面是 6. 假设有 m 组互斥现象,每组中的那两个数字的面紧贴在一起,骰子就不能稳定的垒起来.  atm想计算一下有多少种不同的可能的垒骰子方式. 两种垒骰子方式相同,当且仅当这两种方式中对应高度的骰子的对应数字的朝向都相同. 由于方案数可能过多,请输出模

矩阵快速幂 模板与简单讲解

模板 快速幂模板 1 void solve(matrix t,long long o) 2 { 3 matrix e; 4 5 memset(e.a,0,sizeof(e.a)); 6 7 for (int i = 0;i < d;i++) 8 e.a[i][i] = 1; 9 10 while (o) 11 { 12 if (o & 1) 13 { 14 e = mul(e,t); 15 } 16 17 o >>= 1; 18 19 t = mul(t,t); 20 } 21

hdu4686 简单的矩阵快速幂求前n项和

HDU4686 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4686 题意:题目说的很清楚了,英语不好的猜也该猜懂了,就是求一个表达式的前n项和,矩阵快速幂一般多加一行一列来完成这个加的操作.具体看代码吧.比较简单,唯一有一点坑的地方,就是ax和bx可能比较大,在求ax*bx的时候,要考虑溢出的问题,需要先mod.其他没有了,直接看代码吧! //Author: xiaowuga #include <bits/stdc++.h> #define