[HDOJ5950]Recursive sequence(递推,二项展开,矩阵快速幂)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5950

题意:求解递推式f(n)=f(n-1)+2*f(n-2)+n^4。

写了个小东西,不过我的文章里式子是2*f(n-1),内容差不多。凑合看

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3
 4 typedef long long LL;
 5 const LL mod = 2147493647;
 6 const int maxn = 10;
 7 LL n, a, b;
 8
 9 typedef struct Matrix {
10     LL m[maxn][maxn];
11     int r;
12     int c;
13     Matrix() {
14         r = c = 0;
15         memset(m, 0, sizeof(m));
16     }
17 } Matrix;
18
19 Matrix mul(Matrix m1, Matrix m2) {
20     Matrix ans = Matrix();
21     ans.r = m1.r;
22     ans.c = m2.c;
23     for(int i = 1; i <= m1.r; i++) {
24         for(int j = 1; j <= m2.r; j++) {
25                for(int k = 1; k <= m2.c; k++) {
26                 if(m2.m[j][k] == 0) continue;
27                 ans.m[i][k] = ((ans.m[i][k] + m1.m[i][j] * m2.m[j][k] % mod) % mod) % mod;
28             }
29         }
30     }
31     return ans;
32 }
33
34 Matrix quickmul(Matrix m, LL n) {
35     Matrix ans = Matrix();
36     for(int i = 1; i <= m.r; i++) {
37         ans.m[i][i]  = 1;
38     }
39     ans.r = m.r;
40     ans.c = m.c;
41     while(n) {
42         if(n & 1) {
43             ans = mul(m, ans);
44         }
45         m = mul(m, m);
46         n >>= 1;
47     }
48     return ans;
49 }
50
51
52 int main() {
53     // freopen("in", "r", stdin);
54     int T;
55     scanf("%d", &T);
56     while(T--) {
57         scanf("%I64d%I64d%I64d",&n,&a,&b);
58         if(n == 1) {
59             printf("%I64d\n", a);
60             continue;
61         }
62         if(n == 2) {
63             printf("%I64d\n", b);
64             continue;
65         }
66
67         Matrix x; x.r = 7, x.c = 7;
68         Matrix y; y.r = 7, y.c = 1;
69         x.m[1][1]=1,x.m[1][2]=2,x.m[1][3]=1,x.m[1][4]=4,x.m[1][5]=6,x.m[1][6]=4,x.m[1][7]=1;
70         x.m[2][1]=1,x.m[2][2]=0,x.m[2][3]=0,x.m[2][4]=0,x.m[2][5]=0,x.m[2][6]=0,x.m[2][7]=0;
71         x.m[3][1]=0,x.m[3][2]=0,x.m[3][3]=1,x.m[3][4]=4,x.m[3][5]=6,x.m[3][6]=4,x.m[3][7]=1;
72         x.m[4][1]=0,x.m[4][2]=0,x.m[4][3]=0,x.m[4][4]=1,x.m[4][5]=3,x.m[4][6]=3,x.m[4][7]=1;
73         x.m[5][1]=0,x.m[5][2]=0,x.m[5][3]=0,x.m[5][4]=0,x.m[5][5]=1,x.m[5][6]=2,x.m[5][7]=1;
74         x.m[6][1]=0,x.m[6][2]=0,x.m[6][3]=0,x.m[6][4]=0,x.m[6][5]=0,x.m[6][6]=1,x.m[6][7]=1;
75         x.m[7][1]=0,x.m[7][2]=0,x.m[7][3]=0,x.m[7][4]=0,x.m[7][5]=0,x.m[7][6]=0,x.m[7][7]=1;
76
77         y.m[1][1]=b,y.m[2][1]=a,y.m[3][1]=16,y.m[4][1]=8,y.m[5][1]=4,y.m[6][1]=2,y.m[7][1]=1;
78         Matrix p = quickmul(x,n-2);
79         Matrix ret = mul(p,y);
80         printf("%I64d\n", ret.m[1][1]);
81         // cout << ret.r << " " << ret.c << endl;
82     }
83     return 0;
84 }
时间: 2024-08-19 02:18:59

[HDOJ5950]Recursive sequence(递推,二项展开,矩阵快速幂)的相关文章

矩阵乘法(四):分析问题,确定递推式,采用矩阵快速幂求解

应用矩阵快速幂运算可以解决递推问题.在实际应用中,有时候题目并没有直接给出递推式,需要认真分析问题,找出递推式,然后再利用矩阵快速幂运算加快问题的求解. [例1]程序阅读理解. 有如下的C语言程序: #include <stdio.h>int main(){     int n,m,f,i;     while(scanf("%d%d",&n,&m)!=EOF)     {           f=0;           for(i=1;i<=n;i

NYOJ——301递推求值(矩阵快速幂)

递推求值 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给你一个递推公式: f(x)=a*f(x-2)+b*f(x-1)+c 并给你f(1),f(2)的值,请求出f(n)的值,由于f(n)的值可能过大,求出f(n)对1000007取模后的值. 注意:-1对3取模后等于2 输入 第一行是一个整数T,表示测试数据的组数(T<=10000) 随后每行有六个整数,分别表示f(1),f(2),a,b,c,n的值. 其中0<=f(1),f(2)<100,-100<=

HDU2256&amp;&amp;HDU4565:给一个式子的求第n项的矩阵快速幂

HDU2256 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2256 题意:求(sqrt(2)+sqrt(3))^2n%1024是多少. 这个题算是hdu4565的一个常数版本了,所以我们先说这道题.对于这道题的做法我们可以计算((sqrt(2)+sqrt(3))^2)^n=(5+2*sqrt(6))^n,对于(5+2*sqrt(6))^n我们知道答案必定是以an+bn*sqrt(6),而对于下一项我们只需要求(an+bn*sqrt(6))*(5

poj2778 DNA Sequence【AC自动机】【矩阵快速幂】

DNA Sequence Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 19991   Accepted: 7603 Description It's well known that DNA Sequence is a sequence only contains A, C, T and G, and it's very useful to analyze a segment of DNA Sequence,For ex

51nod 1242 斐波那契数列的第N项(矩阵快速幂)

1242 斐波那契数列的第N项 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 斐波那契数列的定义如下: F(0) = 0 F(1) = 1 F(n) = F(n - 1) + F(n - 2) (n >= 2) (1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, ...) 给出n,求F(n),由于结果很大,输出F(n) % 1000000009的结果即可. Input 输入1个数n(1 <=

DNA Sequence POJ - 2778 邻接矩阵 trie图 矩阵快速幂

首先构造trie图. 我们明确一点的是,给出trie图,那么所有点的转移方式都是唯一可以确定的.即使是没有这个字符,他也会指向根节点. 我们根据离散数学的知识可以知道.计算有向图的邻接矩阵,然后k次方,就能够计算出从某一个点到另一个点,有多少条长度为k的路径. 故,我们构造出来trie图,拿出该图的邻接矩阵,就能计算路径数目.--(注意改图是有向图)-- trie图的构造不说了,模板. 邻接矩阵的构造根据trie图来的.我们在trie图上找到每一个节点,查看他的相邻节点,即A,G,C,T四个点指

CF1106F Lunar New Year and a Recursive Sequence——矩阵快速幂&amp;&amp;bsgs

题意 设 $$f_i = \left\{\begin{matrix}1 , \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \  i < k\\ \prod_{j=1}^k f_{i-j}^{b_j} \ mod \ p, \ \ \ \ \ i > k\end{matrix}\right.$$ 求 $f_k$($1 \leq f_k < p$),使得 $f_m = n$.($1 \leq k\leq 100$) 分析 $f_n$ 可以表示

HDU——1005Number Sequence(模版题 二维矩阵快速幂+操作符重载)

Number Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 148003    Accepted Submission(s): 35976 Problem Description A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A

Recursive sequence(HDU5950 矩阵快速幂)

题目: 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 a and b on a blackboard. And then, the cows wou

HDU 5950 Recursive sequence 【递推+矩阵快速幂】 (2016ACM/ICPC亚洲区沈阳站)

Recursive sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 249    Accepted Submission(s): 140 Problem Description Farmer John likes to play mathematics games with his N cows. Recently, t