5936 桃子的矩阵快速幂

生来就可爱ヽ(ⅴ<●) 提交于 2019-12-02 17:00:31

桃子的矩阵快速幂

时间限制(普通/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 }
矩阵快速幂

 

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!