问题 B: 【递归】普通递归关系
时间限制: 1 Sec 内存限制: 128 MB提交: 12 解决: 12
[提交][状态][讨论版]
题目描述
考虑以下定义在非负整数n上的递归关系:
其中a、b是满足以下两个条件的常数:
给定f0, f1, a, b和 n,请你写一个程序计算F(n),可以假定F(n)是绝对值不超过109的整数(四舍五入)。
其中a、b是满足以下两个条件的常数:
给定f0, f1, a, b和 n,请你写一个程序计算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 ",A[1][0]); } int main() { cin>>a>>b>>c>>d>>n; slove(); return 0; }