E. Product Oriented Recurrence(矩阵快速幂+欧拉降幂)

在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
#define maxn 300005
#define ll long long
const int mod = 1e9+7;
const int modd = 1e9+6;       //欧拉降幂

ll n,f1,f2,f3,c;
int b[10][10];
struct Mat{                  //矩阵快速幂
    ll m[10][10];
    Mat(){
        memset(m,0,sizeof(m));
    }
    inline void build(int len){
        for(int i=1;i<=len;i++)m[i][i]=1;
    }
}a;

Mat Mul(Mat x,Mat y,int len){
    Mat c;
    for(int i=1;i<=len;i++)
        for(int j=1;j<=len;j++)
            for(int k=1;k<=len;k++)
                c.m[j][i]=(c.m[j][i]+x.m[j][k]*y.m[k][i]%modd)%modd;     //欧拉降幂
    return c;
}

Mat poww(Mat x,ll y,int len){
    Mat aa;aa.build(len);
    while(y){
        if(y&1)aa=Mul(aa,x,len);
        x=Mul(x,x,len);
        y>>=1;
    }
    return aa;
}

ll poww2(ll x,ll y){
    ll ans=1;
    while(y){
        if(y&1)ans=(ans*x)%mod;
        x=x*x%mod;
        y>>=1;
    }
    return ans%mod;
}

ll wow(Mat s,int k){
    if(k==1)return s.m[3][1];
    else if(k==2)return s.m[2][1];
    else return s.m[1][1];
}

int main()
{
    cin>>n>>f1>>f2>>f3>>c;
    a.m[1][1]=1,a.m[2][1]=1,a.m[3][1]=1;    //构建矩阵
    a.m[1][2]=1,a.m[2][2]=0,a.m[3][2]=0;
    a.m[1][3]=0,a.m[2][3]=1,a.m[3][3]=0;
    Mat ans1=poww(a,n-3,3);
    ll ans11=wow(ans1,1),ans12=wow(ans1,2),ans13=wow(ans1,3);
    a.m[4][1]=1;a.m[5][1]=0;              //构建矩阵2
    a.m[4][2]=0;a.m[5][2]=0;
    a.m[4][3]=0;a.m[5][3]=0;
    a.m[4][4]=1;a.m[5][4]=1;
    a.m[4][5]=0;a.m[5][5]=1;
    Mat ans2=poww(a,n-3,5);
    ll ans22=2*ans2.m[4][1]%modd+2*ans2.m[5][1]%modd;  //欧拉降幂
    ans22%=modd;                                       //欧拉降幂
    printf("%lld",poww2(f1,ans11)*poww2(f2,ans12)%mod*poww2(f3,ans13)%mod*poww2(c,ans22)%mod);
    return 0;
}
希望用自己的努力为自己赢得荣誉。
原文地址:https://www.cnblogs.com/Mmasker/p/11917476.html