【递归】普通递归关系 矩阵快速幂

问题 B: 【递归】普通递归关系

时间限制: 1 Sec  内存限制: 128 MB
提交: 12  解决: 12
[提交][状态][讨论版]

题目描述

考虑以下定义在非负整数n上的递归关系:




其中ab是满足以下两个条件的常数:




给定f0, f1, a, bn,请你写一个程序计算F(n),可以假定F(n)是绝对值不超过109的整数(四舍五入)

输入

输入文件一行依次给出5个数,f0 ,f1,a,b和n,f0,f1是绝对值不超过109 ,n是非负整数,不超过109。另外,a、b是满足上述条件的实数,且|a|,|b|≤106

输出

一行,F(n)的值

样例输入

0 1 1 1 20

样例输出

6765
复制代码
#include <bits/stdc++.h>
using namespace std;
 
typedef vector <int> vec;
typedef vector <vec> mat;
typedef long long ll;
 
const int M = 10000;
 
mat mul(mat &A, mat &B){
 
    mat C(A.size(), vec(B[0].size()));
    for (int i = 0; i < A.size(); i++){
        for (int k = 0; k < B.size(); k++){
            for (int j = 0; j < B[0].size(); j++){
                C[i][j] = (C[i][j]+A[i][k]*B[k][j]) % M;
            }
        }
    }
    return C;
}
 
mat pow(mat A, ll n){
 
    mat B(A.size(), vec(A.size()));
    for (int i = 0; i < A.size(); i++){
        B[i][i] = 1;
    }
    while (n > 0){
 
        if (n & 1) B = mul(B, A);
        A = mul(A, A);
        n >>= 1;
    }
    return B;
}
ll  n,a,b,c,d;
void slove(){
    mat A(2, vec(2));
    A[0][0] = a; A[0][1] = b;
    A[1][0] = c; A[1][1] = d;
    A = pow(A, n);
    printf("%d\n",A[1][0]);
}
int main() {
    cin>>a>>b>>c>>d>>n;
    slove();
    return 0;
}
View Code
复制代码

 

posted on   disppr  阅读(421)  评论(0编辑  收藏  举报

编辑推荐:
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
阅读排行:
· 手把手教你更优雅的享受 DeepSeek
· AI工具推荐:领先的开源 AI 代码助手——Continue
· 探秘Transformer系列之(2)---总体架构
· V-Control:一个基于 .NET MAUI 的开箱即用的UI组件库
· 乌龟冬眠箱湿度监控系统和AI辅助建议功能的实现
< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8

统计

点击右上角即可分享
微信分享提示