牛客编程巅峰赛S1第7场 - 黄金&钻石 C.数列求值

牛客编程巅峰赛S1第7场 - 黄金&钻石 C.数列求值

题目链接

题目描述

已知 a 0 = 0 , a 1 = 1 , a i = b a i − 1 + c a i − 2 ( i ≥ 2 ) a_0=0,a_1=1,a_i=b a_{i-1}+ c a_{i-2}(i\ge2) a0=0,a1=1,ai=bai1+cai2(i2),现在给你b和c两个系数的值,请你求出 a n a_n an 除以 1 0 9 + 7 10^9+7 109+7 的余数。
( 2 ≤ n ≤ 1 0 18 , 0 ≤ b , c ≤ 1 0 9 ) (2 \leq n \leq 10^{18}, 0 \leq b,c \leq 10^9) (2n1018,0b,c109)

示例1

输入

2,1,1

输出

1

示例2

输入

5,1,2

输出

11

非常典型的矩阵快速幂,题目好像改了又改,但其实就是系数矩阵换一下位置就行了,系数矩阵就是:
[ b c 1 0 ] \left[ \begin{matrix} b&c\\ 1&0\\ \end{matrix} \right] [b1c0]
递推式就是:
[ a i a i − 1 ] = [ b c 1 0 ] [ a i − 1 a i − 2 ] \left[ \begin{matrix} a_i\\ a_{i-1}\\ \end{matrix} \right]= \left[ \begin{matrix} b&c\\ 1&0\\ \end{matrix} \right] \left[ \begin{matrix} a_{i-1}\\ a_{i-2}\\ \end{matrix} \right] [aiai1]=[b1c0][ai1ai2]
我没写外置函数,可能有点丑,见谅,AC代码如下:

long long nthElement(long long n, long long b, long long c) {
    long long a[2][2],ans[2][2],C[2][2],mod=1e9+7;
    a[0][0]=b,a[0][1]=c;
    a[1][0]=1,a[1][1]=0;
    memset(ans,0,sizeof(ans));
    for(int i=0;i<2;i++) ans[i][i]=1;
    while(n>0)
    {
        if(n&1){
            memset(C,0,sizeof(C));
             for(int i=0;i<2;i++)
             {
                 for(int k=0;k<2;k++)
                 {
                     if(a[i][k]==0) continue;
                     for(int j=0;j<2;j++)
                     {
                         C[i][j]=(C[i][j]+a[i][k]*ans[k][j])%mod;
                     }
                 }
             }
            for(int i=0;i<2;i++){
                for(int j=0;j<2;j++)
                    ans[i][j]=C[i][j];
            }
        }
        memset(C,0,sizeof(C));
         for(int i=0;i<2;i++)
         {
             for(int k=0;k<2;k++)
             {
                 if(a[i][k]==0) continue;
                 for(int j=0;j<2;j++)
                 {
                     C[i][j]=(C[i][j]+a[i][k]*a[k][j])%mod;
                 }
             }
         }
        for(int i=0;i<2;i++){
            for(int j=0;j<2;j++)
                a[i][j]=C[i][j];
        }
        n>>=1;
    }
    return ans[1][0];
}

你可能感兴趣的:(矩阵,牛客)