[HDU1588]Gauss Fibonacci(递推+矩阵快速幂)

标签: hdu 递推 矩阵
484人阅读 评论(0) 收藏 举报
分类:

题目描述

传送门
题意
给出整数k,b,n,Mod.
令F(n)为Fibonacci数列的第n项,f(x)=kx+b,求i=0n1F(f(i))
答案对Mod取模。

题解

经典的二分递推+矩阵快速幂的题目。
和POJ3233有点相似。
初始矩阵

A=[1110]

An的(1,2)位置表示Fibonacci数列的第n项的值。
sum(i)=i=1nAf(i)

那么对于sum(x),考虑从sum(x2)递推过来

一个性质显然:

f(x+y)=f(x)+f(y)b

如果x为偶数,则
sum(x)=(1+Af(x2)b)(Af(1)+Af(2)++Af(x2))

sum(x)=(1+Af(x2)b)sum(x2)

如果x为奇数,则
sum(x)=Af(1)+(Af(1)b+Af(x2+1)b)(Af(1)+Af(2)++Af(x2))

sum(x)=Af(1)+(Af(1)b+Af(x2+1)b)sum(x2)

这样直接递推就好了。

代码

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
#define LL long long

int k,b,n,Mod;
struct hp{LL a[3][3];}unit,A,A_b,A_kb,ans;

inline hp jia(hp a,hp b)
{
    for (int i=1;i<=2;++i)
        for (int j=1;j<=2;++j)
            a.a[i][j]=(a.a[i][j]+b.a[i][j])%Mod;
    return a;
}
inline hp cheng(hp a,hp b)
{
    hp ans;
    memset(ans.a,0,sizeof(ans.a));
    for (int i=1;i<=2;++i)
        for (int j=1;j<=2;++j)
            for (int k=1;k<=2;++k)
                ans.a[i][j]=(ans.a[i][j]+a.a[i][k]*b.a[k][j]%Mod)%Mod;
    return ans;
}
inline hp matrix_fast_pow(hp a,LL p)
{
    hp ans=unit;
    for (;p;p>>=1,a=cheng(a,a))
        if (p&1)
            ans=cheng(ans,a);
    return ans;
}
inline hp dfs(int x)
{
    if (x==1) return A_kb;
    hp now=dfs(x/2);
    if (x%2==0)
    {
        hp nxt=matrix_fast_pow(A,(LL)k*(LL)(x/2));
        nxt=jia(nxt,unit);
        nxt=cheng(nxt,now);
        return nxt;
    }
    else
    {
        hp nxt=matrix_fast_pow(A,(LL)k*(LL)(x/2+1));
        hp A_f=matrix_fast_pow(A,(LL)k+(LL)b);
        hp A_fb=matrix_fast_pow(A,(LL)k);
        nxt=jia(nxt,A_fb);
        nxt=cheng(nxt,now);
        nxt=jia(nxt,A_f);
        return nxt;
    }
}

int main()
{
    for (int i=1;i<=2;++i) unit.a[i][i]=1;
    A.a[1][1]=A.a[1][2]=A.a[2][1]=1; A.a[2][2]=0;
    while (~scanf("%d%d%d%d",&k,&b,&n,&Mod))
    {
        A_b=matrix_fast_pow(A,(LL)b);
        A_kb=matrix_fast_pow(A,(LL)k+(LL)b);
        if (n==1)
        {
            printf("%I64d\n",A_b.a[1][2]);
            continue;
        }
        ans=dfs(n-1);
        ans=jia(ans,A_b);
        printf("%I64d\n",ans.a[1][2]);
    }
}
查看评论

HDU 1588 Gauss Fibonacci(矩阵快速幂+二分等比序列求和)

HDU 1588 Gauss Fibonacci(矩阵快速幂+二分等比序列求和) ACM 题目地址:HDU 1588 Gauss Fibonacci 题意:  g(i)=k*i+b...
  • hcbbt
  • hcbbt
  • 2014-08-05 01:10:27
  • 2403

hdu1588 Gauss Fibonacci (矩阵快速幂)

P.S. 感谢大神,借鉴于此:http://blog.csdn.net/shiyuankongbu/article/details/8458459  讲的真心很明白,,,        ...
  • niuxiunan
  • niuxiunan
  • 2013-09-02 17:51:45
  • 527

hdu1588 Gauss Fibonacci 矩阵快速幂

F(x)F(x)是斐波拉契数列 给定一次函数g(x)=ax+bg(x)=ax+b 求 Σni=0F(g(i)) \underset {i=0} {\overset n {\Large \Si...
  • zjtzyrc
  • zjtzyrc
  • 2015-04-28 14:37:54
  • 205

poj3070(利用矩阵快速幂加速递推式)

题意:求斐波拉契数的第n项,n 思路分析:暴力做肯定超时。这里有矩阵进行加速,很多递推的式子(DP)都可以转化成矩阵乘法来做。 递推式为F(n) = F(n-1) + F(n-2) , 对于一个...
  • u013509299
  • u013509299
  • 2014-08-27 10:41:58
  • 1159

hdu1588 Gauss Fibonacci

其实就是一个矩阵加上等比数列求和的问题,在因为b等于0的问题上卡住了,最后看了人家的解法重新构造了乘数矩阵 code: #include #include #include #include...
  • yueqiq
  • yueqiq
  • 2012-12-13 18:10:11
  • 277

HDU1588 Gauss Fibonacci 矩阵应用

/* 由f(n)=f(n-1)+f(n-2)构造矩阵 令 Fn(1,2) = |f(n) f(n-1)| A(2 2) = |1 1| |1 0| F1(1 2) = |1 0| Fn = F(...
  • mishifangxiangdefeng
  • mishifangxiangdefeng
  • 2011-12-29 20:24:59
  • 809

Gauss Fibonacci hdu1588

/* 很明显要用矩阵乘法 求的是F(b) + F(b + k) + ... + F((n - 1) * k + b) 的和 A ^ (k + m) = A ^ k * A ^ m A = 0 1 ...
  • huixisheng
  • huixisheng
  • 2010-04-08 12:04:00
  • 578

矩阵快速幂 ——(递推表达式)

矩阵快速幂    首先知道矩阵       矩阵(Matrix)是一个按照长方阵列排列的复数或实数集合;      矩阵乘法: 定义:设A为    的矩阵,B为    的矩阵,那么称    的矩阵...
  • WR_technology
  • WR_technology
  • 2016-05-06 19:44:01
  • 1564

HDU1588 Gauss Fibonacci (矩阵快速幂+等比数列二分求和)

Problem Description Without expecting, Angel replied quickly.She says: "I'v heard that you'r a ve...
  • jijijix
  • jijijix
  • 2016-07-21 09:47:52
  • 186

HDU1588 Gauss Fibonacci

#include #include using namespace std; int mod; typedef struct {     long long m[2][2]; }ma...
  • AC_Gibson
  • AC_Gibson
  • 2014-08-01 11:23:17
  • 436
    个人资料
    持之以恒
    等级:
    访问量: 69万+
    积分: 1万+
    排名: 629
    最新评论