Codeforces Round #566 (Div. 2)E. Product Oriented Recurrence【矩阵】

本文介绍了一种使用矩阵快速幂求解特定递归序列第n项的高效算法,适用于形如fn=c2n-6*fn-1*fn-2*fn-3的递归公式。通过构造矩阵并利用快速幂算法,可以显著减少计算复杂度,从而在大数运算中快速求得结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

E. Product Oriented Recurrence

time limit per test

1 second

memory limit per test

256 megabytes

input

standard input

output

standard output

Let fx=c2x−6⋅fx−1⋅fx−2⋅fx−3fx=c2x−6⋅fx−1⋅fx−2⋅fx−3 for x≥4x≥4.

You have given integers nn, f1f1, f2f2, f3f3, and cc. Find fnmod(109+7)fnmod(109+7).

Input

The only line contains five integers nn, f1f1, f2f2, f3f3, and cc (4≤n≤10184≤n≤1018, 1≤f11≤f1, f2f2, f3f3, c≤109c≤109).

Output

Print fnmod(109+7)fnmod(109+7).

Examples

input

Copy

5 1 2 5 3

output

Copy

72900

input

Copy

17 97 41 37 11

output

Copy

317451037

Note

In the first example, f4=90f4=90, f5=72900f5=72900.

In the second example, f17≈2.28×1029587f17≈2.28×1029587.

 

 

分析:

我们可以将通项写成如下形式:

f[x]=c^{C[x]}*f[1]^{F1[x]}*f[2]^{F2[x]}*f[3]^{F3[x]}

其中:

F1[x]=F1[x-1]+F1[x-2]+F1[x-3]

F2[x]=F2[x-1]+F2[x-2]+F2[x-3]

F3[x]=F3[x-1]+F3[x-2]+F3[x-3]

C[x]=C[x-1]+C[x-2]+C[x-3]+2*x-6

构造3维矩阵

\left[ \begin{matrix} F[i+1] \\ F[i] \\ F[i-1] \end{matrix} \right] \tag{3} =\left[ \begin{matrix} 1 & 1 & 1 \\ 1 & 0 & 0 \\ 0 & 1 & 0 \end{matrix} \right] \tag{3} \left[ \begin{matrix} F[i] \\ F[i-1] \\ F[i-2] \end{matrix} \right] \tag{3}

得到F1,F2,F3。

将C[x]转化一下

C[x]=C[x-1]+C[x-2]+C[x-3]+G[x]

G[x]=2x-6=G[x-1]+2

构造矩阵

\left[ \begin{matrix}C[i+1]\\ C[i]\\ C[i-1]\\G[i+2]\\ 2 \end{matrix} \right] \tag{3} =\left[ \begin{matrix} 1 & 1 & 1 & 1& 0\\ 1 & 0& 0& 0& 0\\ 0& 1 & 0& 0& 0\\ 0& 0& 0& 1& 1\\ 0& 0& 0& 0& 1 \end{matrix} \right] \tag{3} \left[ \begin{matrix}C[i]\\ C[i-1]\\ C[i-2]\\G[i+1]\\ 2 \end{matrix} \right] \tag{3}

得到C。

然后欧拉降幂后直接计算即可。

#include "bits/stdc++.h"

using namespace std;
typedef long long LL;
const int maxn = 1e6 + 5;
const int MOD = 1e9 + 6;
const int mod = 1e9 + 7;
using namespace std;

long long qk(long long a, long long n) {
    long long ans = 1;
    while (n) {
        if (n & 1)ans = ans * a % mod;
        n >>= 1;
        a = a * a % mod;
    }
    return ans;
}

struct Matrix {
    int n;
    LL a[5][5];

    Matrix(int n) : n(n) {
        for (int i = 0; i < n; i++)
            for (int j = 0; j < n; j++)a[i][j] = 0;
    }

};

Matrix operator*(Matrix A, Matrix B) {
    int n = A.n;
    Matrix res(n);
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            for (int k = 0; k < n; k++) {
                res.a[i][j] += (LL) A.a[i][k] * B.a[k][j] % MOD;
                res.a[i][j] %= MOD;
            }
    return res;
}

Matrix operator^(Matrix A, long long b) {
    int n = A.n;
    Matrix res(n), base = A;
    for (int i = 0; i < n; i++)res.a[i][i] = 1;
    while (b) {
        if (b & 1)res = res * base;
        base = base * base;
        b >>= 1;
    }
    return res;
}

Matrix a(3), b(5);

int main() {
    long long n, f1, f2, f3, c;
    cin >> n >> f1 >> f2 >> f3 >> c;
    a.a[0][0] = 1;
    a.a[0][1] = 1;
    a.a[0][2] = 1;
    a.a[1][0] = 1;
    a.a[2][1] = 1;
    b.a[0][0] = 1;
    b.a[0][1] = 1;
    b.a[0][2] = 1;
    b.a[0][3] = 1;
    b.a[1][0] = 1;
    b.a[2][1] = 1;
    b.a[3][3] = 1;
    b.a[3][4] = 1;
    b.a[4][4] = 1;
    a = a ^ (n - 3);
    b = b ^ (n - 3);
    long long ans = 1;
    long long F1 = (a.a[0][2] ) % MOD;
    long long F2 = ( a.a[0][1] ) % MOD;
    long long F3 = (a.a[0][0] ) % MOD;
    ans = qk(f1, F1) * qk(f2, F2) % mod * qk(f3, F3) % mod;
    long long C = (b.a[0][3]*2 + b.a[0][4] * 2) % MOD;
    ans = ans * qk(c, C) % mod;
    cout << ans << endl;

}

 

资源下载链接为: https://pan.quark.cn/s/22ca96b7bd39 在当今的软件开发领域,自动化构建与发布是提升开发效率和项目质量的关键环节。Jenkins Pipeline作为一种强大的自动化工具,能够有效助力Java项目的快速构建、测试及部署。本文将详细介绍如何利用Jenkins Pipeline实现Java项目的自动化构建与发布。 Jenkins Pipeline简介 Jenkins Pipeline是运行在Jenkins上的一套工作流框架,它将原本分散在单个或多个节点上独立运行的任务串联起来,实现复杂流程的编排与可视化。它是Jenkins 2.X的核心特性之一,推动了Jenkins从持续集成(CI)向持续交付(CD)及DevOps的转变。 创建Pipeline项目 要使用Jenkins Pipeline自动化构建发布Java项目,首先需要创建Pipeline项目。具体步骤如下: 登录Jenkins,点击“新建项”,选择“Pipeline”。 输入项目名称和描述,点击“确定”。 在Pipeline脚本中定义项目字典、发版脚本和预发布脚本。 编写Pipeline脚本 Pipeline脚本是Jenkins Pipeline的核心,用于定义自动化构建和发布的流程。以下是一个简单的Pipeline脚本示例: 在上述脚本中,定义了四个阶段:Checkout、Build、Push package和Deploy/Rollback。每个阶段都可以根据实际需求进行配置和调整。 通过Jenkins Pipeline自动化构建发布Java项目,可以显著提升开发效率和项目质量。借助Pipeline,我们能够轻松实现自动化构建、测试和部署,从而提高项目的整体质量和可靠性。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值