zoukankan      html  css  js  c++  java
  • 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 }
    矩阵快速幂
  • 相关阅读:
    1-Java基础回顾整理_06_数组
    1-Java基础回顾整理_05_方法
    1-Java基础回顾整理_04_交互、循环、关键字
    1-Java基础回顾整理_03_类型、变量、运算符
    1-Java基础回顾整理_02_java介绍
    1-Java基础回顾整理_01_计算机发展史
    整合SSM
    Spring整合Mybatis--xml配置文件方式
    java设计模式之动态代理
    Mybatis之动态sql
  • 原文地址:https://www.cnblogs.com/qq-1585047819/p/11756141.html
Copyright © 2011-2022 走看看