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

题目描述

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

其中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 <set>
#include <map>
#include <list>
#include <cmath>
#include <ctime>
#include <deque>
#include <queue>
#include <stack>
#include <cctype>
#include <cstdio>
#include <string>
#include <vector>
#include <cassert>
#include <cstdlib>
#include <cstring>
#include <sstream>
#include <iostream>
#include <algorithm>
#define pi acos(-1.0)
#define mod 1000000007
#define inf 1e20
using namespace std;
int line[20],n,sum=0;
int w[1005][1005];
int dp[1005][1005];
struct mat
{
    int n,m,a[2][2];
    mat(int i=0,int j=0)
    {
        n=i,m=j;
        memset(a,0,sizeof(a));
    }
    mat operator*(const mat&p)const
    {
        mat q(n,p.m);
        int i,j,k;
        for(int i=0; i<n; i++)
            for(int j=0; j<m; j++)
                for(int k=0; k<m; k++)
                    q.a[i][k]=(q.a[i][k]+1LL*a[i][j]*p.a[j][k])%mod;
        return q;
    }
};
int main()
{
    int i,j,m,k,t,f0,f1;
    long long a,b,n,x;
    scanf("%lld%lld%lld%lld%lld",&f0,&f1,&a,&b,&n);
    if(n==0)
    {
        cout<<f0<<endl;
        exit(0);
    }
    if(n==1)
    {
        cout<<f1<<endl;
        exit(0);
    }
    mat f(1,2);
    f.a[0][0]=f1,f.a[0][1]=f0;
    mat g(2,2);
    g.a[0][0]=a,g.a[0][1]=1,g.a[1][0]=b,g.a[1][1]=0;
    n--;
    while(n)
    {
        if(n&1)f=f*g;
        g=g*g;
        n>>=1;
    }
    printf("%d\n",f.a[0][0]);
    //system("pause");
    return 0;
}
时间: 2024-08-14 05:11:17

【递归】普通递归关系(矩阵快速幂)的相关文章

矩阵快速幂 模板与简单讲解

模板 快速幂模板 1 void solve(matrix t,long long o) 2 { 3 matrix e; 4 5 memset(e.a,0,sizeof(e.a)); 6 7 for (int i = 0;i < d;i++) 8 e.a[i][i] = 1; 9 10 while (o) 11 { 12 if (o & 1) 13 { 14 e = mul(e,t); 15 } 16 17 o >>= 1; 18 19 t = mul(t,t); 20 } 21

233 Matrix 矩阵快速幂

In our daily life we often use 233 to express our feelings. Actually, we may say 2333, 23333, or 233333 ... in the same meaning. And here is the question: Suppose we have a matrix called 233 matrix. In the first line, it would be 233, 2333, 23333...

A Simple Math Problem(矩阵快速幂)(寒假闭关第一题,有点曲折啊)

A Simple Math Problem Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 155 Accepted Submission(s): 110   Problem Description Lele now is thinking about a simple function f(x). If x < 10 f(x) = x.If

POJ3420 递推+矩阵快速幂

POJ3420 很有趣的覆盖问题 递归推导如下: f[n] = f[n-1] + 4*f[n-2] + 2 * [ f[n-3] + f[n-5] + f[n-7] +.... ] + 3 *  [ f[n-4] + f[n-6] + f[n-8] +.... ] ; (1) f[n - 2] = f[n-3] + 4*f[n-4] + 2 * [ f[n-5] + f[n-7] + f[n-9] +.... ] + 3 *  [ f[n-6] + f[n-8] + f[n-10] +....

POJ 3233 Matrix Power Series 矩阵快速幂+二分求和

矩阵快速幂,请参照模板 http://www.cnblogs.com/pach/p/5978475.html 直接sum=A+A2+A3...+Ak这样累加肯定会超时,但是 sum=A+A2+...+Ak/2+A(k/2)*(A+A2+...+Ak/2)    k为偶数时: sum=A+A2+...+A(k-1)/2+A((k-1)/2)*(A+A2+...+A(k-1)/2)+Ak    k为奇数时. 然后递归二分求和 PS:刚开始mat定义的是__int64,于是贡献了n次TLE... #i

算法初步:快速乘,快速幂,矩阵快速幂

原创 by zoe.zhang 在刷题的时候遇到了问题,就是当循环或者递推的次数非常大的情况下获取一定结果,这个时候如果作普通运算,那么很容易就超时了,而且有时候结果也大得超范围了,即使是long long类型的也放不下,然后给了提示说是运用快速幂的思想.所以这里对快速幂做了一点思考和探讨. 1.快速乘,快速幂,矩阵快速幂三者的关系 不管是快速乘,还是快速幂算法,实际上都包含了分解问题的思想在里面,将O(n)的复杂度降到O(lgn).学习的时候,一般学习快速幂算法,再由此推广去解决矩阵快速幂问题

SHUOJ1857 Yaoge鸡排系列之九——好多鸡排!!!【矩阵快速幂】

转载请注明出处:http://www.cnblogs.com/KirisameMarisa/p/4187670.html 题目链接:http://202.121.199.212/JudgeOnline/problem.php?id=1857 1857: Yaoge鸡排系列之九——好多鸡排!!! Time Limit: 3 Sec  Memory Limit: 64 MBSubmit: 98  Solved: 6 Description Yaoge买了n块鸡排,其中第n块鸡排的质量为M(n),同时

POJ3233:Matrix Power Series(矩阵快速幂+二分)

http://poj.org/problem?id=3233 题目大意:给定矩阵A,求A + A^2 + A^3 + … + A^k的结果(两个矩阵相加就是对应位置分别相加).输出的数据mod m.k<=10^9.这道题两次二分,相当经典.首先我们知道,A^i可以二分求出.然后我们需要对整个题目的数据规模k进行二分.比如,当k=6时,有:A + A^2 + A^3 + A^4 + A^5 + A^6 =(A + A^2 + A^3) + A^3*(A + A^2 + A^3)应用这个式子后,规模

HDU2276 - Kiki &amp; Little Kiki 2(矩阵快速幂)

题目链接 题意:有n盏灯,编号从1到n.他们绕成一圈,也就是说,1号灯的左边是n号灯.如果在第t秒的时候,某盏灯左边的灯是亮着的,那么就在第t+1秒的时候改变这盏灯的状态.输入m和初始灯的状态.输出m秒后,所有灯的状态. 思路:其实每盏灯的状态之和前一盏和自己有关,所以可以得到一个关系矩阵.假设有6盏灯,因此可以得到关系矩阵如下: (1, 0, 0, 0, 0, 1) (1, 1, 0, 0, 0, 0) (0, 1, 1, 0, 0, 0) (0, 0, 1, 1, 0, 0) (0, 0,

UVA10518 - How Many Calls?(矩阵快速幂)

题目链接 题意:求第n个斐波那契数的递归次数MOD b 思路:用矩阵快速幂求斐波那契数列,然后打表找出递归次数的规律为f(n) = 2 * F(n) - 1(F(n)为斐波那契数). 代码: #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> typedef long long ll; using namesp