5936 桃子的矩阵快速幂

桃子的矩阵快速幂 分享至QQ空间

时间限制(普通/Java):1000MS/3000MS     内存限制:65536KByte
总提交: 6            测试通过:3

描述

 

桃子得到了一个递推式,f(n)=2*f(n-2)+f(n-1)+n^4,f(1)=a,f(2)=b,现在给你n,a,b,要你计算f(n)的值为多少。

输入

 

第一行一个整数T(T=100),表示有T组数据。

对于每组数据,第一行三个整数n(1≤n≤2^31),a(1≤a≤2^31),b(1≤b≤2^31)。

输出

 

对于每组数据输出一个数即f(n)的值,由于这个数会很大,你需要输出f(n)%2147493647后的值。

样例输入

样例输出

提示

第一个样例:第三个数字85=2*1+2+3^4。

第二个样例:第三个数字93=2*1+10+3^4,第四个数字369=2*10+93+4^4。

解题思路: 

f[n]=2*f[n-2]+f[n-1]+n^4;            f[3]=2*f[1]+f[2]+3^4;      3^4如何用2的表达式表示出来  

f[n+1]=2*f[n-1]+f[n]+(n+1)^4;     f[4]=2*f[2]+f[3]+4*4;      4^4如何用4d的表达式表示出来   

(n+1)^4=n^4+4*n^3+6*n^2+4*n+1;      //后一项由前一项表示出来

所以 初始矩阵 b a 16 8 4 2 1

构造矩阵如代码

 1 #include <bits/stdc++.h>
 2 #define ll long long
 3 #define mod(x) ((x)%MOD)
 4 using namespace std;
 5 
 6 int t;
 7 const ll MOD=2147493647;
 8 const int maxn=7;
 9 ll n,A,B;
10 
11 struct mat{
12     int m[maxn][maxn];
13 }unit;
14 
15 mat operator*(mat a,mat b){
16     mat ret;
17     ll x=0;
18     for(int i=0;i<maxn;i++)
19     for(int j=0;j<maxn;j++){
20         x=0;
21         for(int k=0;k<maxn;k++){
22             x+=mod(1LL*a.m[i][k]*b.m[k][j]);
23         }
24         ret.m[i][j]=mod(x);
25     }
26     return ret;
27 }
28 
29 void init_unit(){
30     for(int i=0;i<maxn;i++){
31         unit.m[i][i]=1;
32     }
33     return;
34 }
35 
36 mat pow_mat(mat a,ll m){
37     mat ret=unit;
38     while(m){
39         if(m&1) ret=ret*a;
40         a=a*a;
41         m>>=1;
42     }
43     return ret;
44 
45 }
46 
47 int main(){
48     ios::sync_with_stdio(false);
49     init_unit();
50     cin>>t;
51     while(t--){
52         cin>>n>>A>>B;
53         mat a,b;
54         if(n==1) cout << A << endl;
55         else if(n==2) cout << B << endl;
56         else{
57             a.m[0][0]=B,a.m[0][1]=A,a.m[0][2]=16,a.m[0][3]=8,a.m[0][4]=4,a.m[0][5]=2,a.m[0][6]=1;
58 
59             b.m[0][0]=1,b.m[0][1]=1,b.m[0][2]=0,b.m[0][3]=0,b.m[0][4]=0,b.m[0][5]=0,b.m[0][6]=0;
60             b.m[1][0]=2,b.m[1][1]=0,b.m[1][2]=0,b.m[1][3]=0,b.m[1][4]=0,b.m[1][5]=0,b.m[1][6]=0;
61             b.m[2][0]=1,b.m[2][1]=0,b.m[2][2]=1,b.m[2][3]=0,b.m[2][4]=0,b.m[2][5]=0,b.m[2][6]=0;
62             b.m[3][0]=4,b.m[3][1]=0,b.m[3][2]=4,b.m[3][3]=1,b.m[3][4]=0,b.m[3][5]=0,b.m[3][6]=0;
63             b.m[4][0]=6,b.m[4][1]=0,b.m[4][2]=6,b.m[4][3]=3,b.m[4][4]=1,b.m[4][5]=0,b.m[4][6]=0;
64             b.m[5][0]=4,b.m[5][1]=0,b.m[5][2]=4,b.m[5][3]=3,b.m[5][4]=2,b.m[5][5]=1,b.m[5][6]=0;
65             b.m[6][0]=1,b.m[6][1]=0,b.m[6][2]=1,b.m[6][3]=1,b.m[6][4]=1,b.m[6][5]=1,b.m[6][6]=1;
66 
67             b=pow_mat(b,n-2);
68             a=a*b;
69             cout << a.m[0][0] << endl;
70         }
71     }
72     return 0;
73 }
矩阵快速幂
原文地址:https://www.cnblogs.com/qq-1585047819/p/11756141.html