关闭

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

标签: hdu递推矩阵
434人阅读 评论(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]);
    }
}
0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

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
  • 2285

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

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

poj 3070 Fibonacci 【矩阵快速幂 求第N个斐波那契数%1000】

Fibonacci Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11123   Acc...
  • chenzhenyu123456
  • chenzhenyu123456
  • 2015-08-30 20:01
  • 2194

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

题目可以看成求 因为fib可以写成A^x的形式,所以就可以将该式改写成等比数列的形式。 首项:A^b 公比:A^k 项数:N 该式写作A^b(I+A^k+(A^k)^2+(A^k)^3+'''+(A^...
  • z690933166
  • z690933166
  • 2013-09-16 22:57
  • 710

hdu1588 Gauss Fibonacci (矩阵快速幂)

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

hdu 1588 Gauss Fibonacci (二分+矩阵快速幂)

Gauss Fibonacci hdu 1588Description Without expecting, Angel replied quickly.She says: “I’v he...
  • feizaoSYUACM
  • feizaoSYUACM
  • 2016-07-17 22:43
  • 265

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

题目链接 题意:g(x) = k * x + b。f(x) 为Fibonacci数列。求f(g(x)),从x = 1到n的数字之和sum,并对m取模。 思路:  设A =...
  • u011345461
  • u011345461
  • 2014-09-03 21:52
  • 842

HDU 1588 Gauss Fibonacci(矩阵快速幂)

题目地址:HDU 1588 用于构造斐波那契的矩阵为 1,1 1,0 设这个矩阵为A。 sum=f(b)+f(k+b)+f(2*k+b)+f(3*k+b)+........+f((n-1)*...
  • u013013910
  • u013013910
  • 2014-09-18 17:25
  • 970

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
  • 158

【HDU】1588 Gauss Fibonacci 矩阵快速幂

传送门:【HDU】1588 Gauss Fibonacci
  • u013368721
  • u013368721
  • 2014-09-18 21:51
  • 731
    个人资料
    • 访问:595710次
    • 积分:17423
    • 等级:
    • 排名:第650名
    • 原创:1151篇
    • 转载:7篇
    • 译文:0篇
    • 评论:167条
    联系方式
    QQ:1209628538 加好友请备注省份和ID
    E-mail:fiona_2000@126.com
    最新评论