题目1081:递推数列 (矩阵快速幂解递推式)

题目1081:递推数列

时间限制:1 秒

内存限制:32 兆

特殊判题:

提交:5885

解决:800

题目描述:

给定a0,a1,以及an=p*a(n-1) + q*a(n-2)中的p,q。这里n >= 2。 求第k个数对10000的模。

输入:

输入包括5个整数:a0、a1、p、q、k。

输出:

第k个数a(k)对10000的模。

样例输入:
20 1 1 14 5
样例输出:
8359
来源:
2009年清华大学计算机研究生机试真题

 1 #include<stdio.h>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 #include<cstdlib>
 6 #include<cmath>
 7 #include<vector>
 8 #include<queue>
 9 #include<map>
10 #include<set>
11
12 using namespace std;
13
14 typedef long long ll;
15
16 const ll mod = 10000;
17
18
19 struct Matrix
20 {
21     ll mat[2][2];
22     Matrix()
23     {
24         memset(mat,0,sizeof(mat));
25     }
26     Matrix operator *(const Matrix A) const
27     {
28         Matrix ret;
29         for(int i=0;i<2;i++)
30         {
31             for(int j=0;j<2;j++)
32             {
33                 for(int k=0;k<2;k++)
34                     ret.mat[i][j] = (ret.mat[i][j]+(mat[i][k]*A.mat[k][j])%mod)%mod;
35             }
36         }
37         return ret;
38     }
39 };
40
41 Matrix quickMul(Matrix x,int k)
42 {
43     Matrix ret;
44     for(int i=0;i<2;i++)
45         ret.mat[i][i] = 1;
46     while(k>0)
47     {
48         if(k&1) ret=ret*x;
49         k>>=1;
50         x=x*x;
51     }
52     return ret;
53 }
54
55 int main()
56 {
57     ll a0,a1,p,q,k;
58     while(~scanf("%lld%lld%lld%lld%lld",&a0,&a1,&p,&q,&k))
59     {
60         Matrix st;
61         st.mat[0][0] = p,st.mat[0][1] = q;
62         st.mat[1][0] = 1,st.mat[1][1] = 0;
63         Matrix a = quickMul(st,k);
64         Matrix b;
65         b.mat[0][0] = a1;
66         b.mat[1][0] = a0;
67         a = a*b;
68         printf("%lld\n",a.mat[1][0]%mod);
69     }
70     return 0;
71 }

时间: 2024-12-15 10:17:07

题目1081:递推数列 (矩阵快速幂解递推式)的相关文章

HDU 5950 - Recursive sequence - [矩阵快速幂加速递推][2016ACM/ICPC亚洲区沈阳站 Problem C]

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5950 Farmer John likes to play mathematics games with his N cows. Recently, they are attracted by recursive sequences. In each turn, the cows would stand in a line, while John writes two positive numbers

HDU 4549 M斐波那契数列 ( 矩阵快速幂 + 费马小定理 )

HDU 4549 M斐波那契数列 (  矩阵快速幂 + 费马小定理  ) 题意:中文题,不解释 分析:最好的分析就是先推一推前几项,看看有什么规律 #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef __int64 LL; #define CLR( a, b ) memset( a, b, sizeof(a) ) #define MOD 100000

hihoCoder 1143 : 骨牌覆盖问题&#183;一(递推,矩阵快速幂)

[题目链接]:click here~~ 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 骨牌,一种古老的玩具.今天我们要研究的是骨牌的覆盖问题: 我们有一个2xN的长条形棋盘,然后用1x2的骨牌去覆盖整个棋盘.对于这个棋盘,一共有多少种不同的覆盖方法呢? 举个例子,对于长度为1到3的棋盘,我们有下面几种覆盖方式: 提示:骨牌覆盖 提示:如何快速计算结果 输入 第1行:1个整数N.表示棋盘长度.1≤N≤100,000,000 输出 第1行:1个整数,表示覆盖方案数 M

矩阵快速幂 ——(递推表达式)

矩阵快速幂 首先知道矩阵 矩阵(Matrix)是一个按照长方阵列排列的复数或实数集合: 矩阵乘法: 定义:设A为 m×p 的矩阵,B为 p×n 的矩阵,那么称 m×n 的矩阵C为矩阵A与B的乘积,记作 C=A×B ,其中矩阵C中的第 i 行第 j 列元素可以表示为: 知道矩阵乘法之后,比如菲波那切数列就是一个递推式, F(n)=F(n-1)+F(n-2); 因为矩阵乘法,所以 设 矩阵 A为 矩阵 B 为 则  A*B  则为    F(n)=        F(n-1)*1+F(n-2)*1

POJ 3734 Blocks(矩阵快速幂加递推)

Blocks Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6133   Accepted: 2931 Description Panda has received an assignment of painting a line of blocks. Since Panda is such an intelligent boy, he starts to think of a math problem of paint

[HDOJ2604]Queuing(递推,矩阵快速幂)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2604 递推式是百度的,主要是练习一下如何使用矩阵快速幂优化. 递推式:f(n)=f(n-1)+f(n-3)+f(n-4),其中f(0)=2, f(1)=4, f(2)=6, f(3)=9. 当n>4时候,需要通过这个关系来递推. 构造矩阵这种东西我以前一直认为是很玄学的,但是如果深入研究的话不难发现其实也有规律可循.这是一个齐次递推式,很好构造. 我们希望通过如下矩阵(1)得到矩阵(2) | f(n

矩阵快速幂优化递推总结

RT,主要总结一下矩阵的求法. 首先能用矩阵快速幂优化的递推类型是f[n]=5f[n-3]+6f[n-2]+2f[n-1]+n^2+n+8之类的 也就是说递推是线性递推且f[n-i]前面的系数是常数,可以含有与n有关的多项式,也可以含有常数的这种递推,下面总结一下矩阵的写法: 先考虑最简单的常数,我们其实可以忽略常数,因为顶多在没有常数的矩阵外面加一行一列就行了 以f[n]=2f[n-1]+6f[n-2]+5f[n-3]+n^2+n为例 先写迭代的矩阵,一般可以写成一行,右边有几项写几项 {f[

ZOJ 3690 &amp; HDU 3658 (矩阵快速幂+公式递推)

ZOJ 3690 题意: 有n个人和m个数和一个k,现在每个人可以选择一个数,如果相邻的两个人选择相同的数,那么这个数要大于k 求选择方案数. 思路: 打表推了很久的公式都没推出来什么可行解,好不容易有了想法结果WA到天荒地老也无法AC.. 于是学习了下正规的做法,恍然大悟. 这道题应该用递推 + 矩阵快速幂. 我们设F(n) = 有n个人,第n个人选择的数大于k的方案数: G(n) = 有n个人,第n个人选择的数小于等于k的方案数: 那么递推关系式即是: F(1)=m?k,G(1)=k F(n

HDU 4549 M斐波那契数列(矩阵快速幂&amp;费马小定理)

ps:今天和战友聊到矩阵快速幂,想到前几天学长推荐去刷矩阵专题,挑了其中唯一一道中文题,没想到越过山却被河挡住去路... 题目链接:[kuangbin带你飞]专题十九 矩阵 R - M斐波那契数列 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u 题意 Description M斐波那契数列F[n]是一种整数数列,它的定义如下: F[0] = a F[1] = b F[n] = F[n-1] * F[n-2]