矩阵快速幂求+斐波那契(牛客generator 1 )

generator 1

 

思路:

因为n过大,用以10为单位的快速幂求解。

 

代码:

#include 
using namespace std;
const int maxn = 1e6+10;
typedef long long LL;
struct Matrix
{
    LL a[2][2];
};
LL mod,x0,x1,a,b;
char ss[maxn];
inline Matrix operator * (const Matrix &A,const Matrix &B) //内联函数,不用超时
{
    Matrix res;
    res.a[0][0] = (A.a[0][0]*B.a[0][0]%mod+A.a[0][1]*B.a[1][0]%mod)%mod;
    res.a[0][1] = (A.a[0][0]*B.a[0][1]%mod+A.a[0][1]*B.a[1][1]%mod)%mod;
    res.a[1][0] = (A.a[1][0]*B.a[0][0]%mod+A.a[1][1]*B.a[1][0]%mod)%mod;
    res.a[1][1] = (A.a[1][0]*B.a[0][1]%mod+A.a[1][1]*B.a[1][1]%mod)%mod;
    return res;
}
Matrix Pow(Matrix A,int n)
{
    Matrix res;
    res.a[0][0] = res.a[1][1] = 1;
    res.a[1][0] = res.a[0][1] = 0;
    while(n)
    {
        if(n&1) res = A*res; //乘法顺序
        A = A*A;
        n >>= 1;
    }
    return res;
}
int main(void)
{
    scanf("%lld%lld%lld%lld",&x0,&x1,&a,&b);
    scanf("%s%lld",ss,&mod);
    int len = strlen(ss);
    Matrix A,B;
    A.a[0][0] = a;
    A.a[0][1] = b;
    A.a[1][0] = 1LL;
    A.a[1][1] = 0;

    B.a[0][0] = x1;
    B.a[0][1] = 0;
    B.a[1][0] = x0;
    B.a[1][1] = 0;
    for(int i=len-1;i>=0;i--)
    {
        if(ss[i]-'0'>0)
        {
            Matrix tp = Pow(A,ss[i]-'0');
            B = tp*B;//注意乘法顺序
        }
        A = Pow(A,10);
    }
    printf("%lld\n",B.a[1][0]);
    return 0;
}

 

你可能感兴趣的:(数学问题)