HDU5950-Recursive sequence(矩阵快速幂)

题目链接:Recursive sequence

题意:给出n头母牛,第一头报a,第二头报b,第i头报f[i-2]*2+f[i-1]+i^4,问第n头母牛报数多少

分析:N,a,b<2^31,果断矩阵快速幂,关键是要推出公式,公式如下,仅作参考

1 0 0 0 0 0 0        1               1

1 1 0 0 0 0 0        i                i+1

1 2 1 0 0 0 0       i2              (i+1)2

1 3 3 1 0 0 0  *   i    =       (i+1)3

1 4 6 4 1 0 0       i              (i+1)4

0 0 0 0 0 0 1       f[i-2]           f[i-1]

0 0 0 0 1 2 1      f[i-1]             f[i]

推出公式后,代入矩阵快速幂,就解决了,代码如下

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 #include <cstring>
 5 #include <algorithm>
 6 #include <cmath>
 7
 8 using namespace std;
 9 const long long mod = 2147493647;
10 struct prog
11 {
12     long long a[8][8];
13 };
14 prog s,B;
15 prog matrixmul(prog a,prog b)
16 {
17     prog c;
18     for(int i=1;i<8;++i)for(int j=1;j<8;++j)
19     {
20         c.a[i][j]=0;
21         for(int k=1;k<8;k++)
22             c.a[i][j]+=(a.a[i][k]*b.a[k][j])%mod;
23         c.a[i][j]%=mod;
24     }
25     return c;
26 }
27 prog mul(prog s,int k)
28 {
29     prog ans;
30     for(int i=1;i<8;++i)for(int j=1;j<8;++j) ans.a[i][j]=(i==j)?1:0;
31     while(k){
32         if(k&1)
33             ans=matrixmul(ans,s);
34         k>>=1;
35         s=matrixmul(s,s);
36     }
37     return ans;
38 }
39 int main()
40 {
41     int n,t,a,b;
42     for(scanf("%d",&t);t--;){
43         scanf("%d %d %d",&n,&a,&b);
44         if(n==1){printf("%lld\n",a%mod);continue;}
45         if(n==2){printf("%lld\n",b%mod);continue;}
46         if(n==3){printf("%lld\n",(81+2*a%mod+b%mod)%mod);continue;}
47         n-=2;
48         for(int i=1;i<=7;++i)for(int j=1;j<=7;++j) s.a[i][j]=0,B.a[i][j]=0;
49         for(int i=1; i<=5; i++)s.a[i][1]=1;
50         for(int i=2; i<=5; i++)s.a[i][2]=i-1;
51         s.a[3][3]=1;s.a[4][3]=3;s.a[5][3]=6;
52         s.a[4][4]=1;s.a[5][4]=4;
53         s.a[5][5]=1;s.a[6][5]=1;
54         s.a[6][6]=1;s.a[7][6]=1;
55         s.a[6][7]=2;
56         B.a[1][1]=1;B.a[2][1]=3;B.a[3][1]=9;B.a[4][1]=27;B.a[5][1]=81;B.a[6][1]=b;B.a[7][1]=a;
57         s=mul(s,n);
58         s=matrixmul(s,B);
59         printf("%lld\n",s.a[6][1]%mod);
60     }
61     return 0;
62 }

时间: 2025-01-02 16:13:32

HDU5950-Recursive sequence(矩阵快速幂)的相关文章

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 5950 Recursive sequence 矩阵快速幂

http://acm.hdu.edu.cn/showproblem.php?pid=5950 一开始以为i^4不能矩阵快速幂,但是结论是可以得,那么要怎么递推呢? 矩阵快速幂的思路都是一样的,matrix_a * matrix_b ^ n 其中,想要维护什么,就在matrix_a写,比如现在是F[n - 1], F[n - 2],我想要递推到下一项,那么就 会变成F[n], F[n - 1],这个时候,你就要寻找一下F[n]和F[n - 1]有什么关系. i^4也一样,想要从i^4 递推到 (i

5950 Recursive sequence (矩阵快速幂)

题意:递推公式 Fn = Fn-1 + 2 * Fn-2 + n*n,让求 Fn; 析:很明显的矩阵快速幂,因为这个很像Fibonacci数列,所以我们考虑是矩阵,然后我们进行推公式,因为这样我们是无法进行运算的.好像有的思路,最后也没想出来,还是参考的大牛的博客 http://blog.csdn.net/spring371327/article/details/52973534 那是讲的很详细了,就不多说了,注意这个取模不是1e9+7,一开始忘了.. 代码如下: #pragma comment

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$ 可以表示

Uva10689 Yet another Number Sequence ( 矩阵快速幂 )

Uva 10689Yet another Number Sequence(  矩阵快速幂  ) 题意: 就是矩阵快速幂,没什么好说的. 分析: 其实还是斐波那契数列.只是最后对应的矩阵不是(1,1)是(a,b)了 MOD = 1; for( int i = 0; i < m; ++i ) MOD *= 10; 代码 #include <cstdio> #include <cstring> #include <algorithm> using namespace s

UVA - 10689 Yet another Number Sequence 矩阵快速幂

                  Yet another Number Sequence Let’s de?ne another number sequence, given by the following function:f(0) = af(1) = bf(n) = f(n − 1) + f(n − 2), n > 1When a = 0 and b = 1, this sequence gives the Fibonacci Sequence. Changing the values

hdu-5667 Sequence(矩阵快速幂+费马小定理+快速幂)

题目链接: Sequence Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 65536/65536 K (Java/Others) Problem Description Holion August will eat every thing he has found. Now there are many foods,but he does not want to eat all of them at once,so he fi

HDU 1005 Number Sequence 矩阵快速幂

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

POJ 2778 DNA Sequence (矩阵快速幂 + AC自动鸡)

题目:传送门 题意: 给你m个病毒串,只由(A.G.T.C) 组成, 问你生成一个长度为 n 的 只由 A.C.T.G 构成的,不包含病毒串的序列的方案数. 解: 对 m 个病毒串,建 AC 自动机, 然后, 这个AC自动机就类似于一张有向图, 可以用邻接矩阵存这张有向图. 最多10个病毒串, 每个病毒串长度不超过 10, 那最多是个 100 * 100 的矩阵, 可以接受. 最后用矩阵快速幂加速推导. #include<cstdio> #include<cstring> #inc