题目大意:

求出斐波那契中的 第 k*i+b 项的和。

思路分析:

定义斐波那契数列的矩阵

f(n)为斐波那契第n项

F(n) = f(n+1)

f(n)

那么能够知道矩阵

A = 1 1

1  0

使得 F(n) = A * F(n+1)

然后我们化简最后的答案

sum = F(b) +   F(K+b) +  F (2*k +b)....

sum = F(b) +  A^k F(b)    +   A^2k F(b).....

sum = (E+A^k + A^2k.....)*F(b)

那么我们把 矩阵  A^k  定义为矩阵 K。

再递推上面的求和公式。

E E   *   SUM = SUM + E

0 K          E              K

所以构造一个内嵌矩阵的矩阵。

然后求出和乘以F(b)就可以。

#include <cstdio>
#include <iostream>
#include <cstring>
#include <iostream>
#define N 2
using namespace std;
typedef long long LL;
LL mod;
struct matrix
{
LL data[N][N];
friend matrix operator * (const matrix A,const matrix B)
{
matrix res;
memset(res.data,0,sizeof res.data);
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
for(int k=0;k<N;k++)
res.data[i][j]+=(A.data[i][k]*B.data[k][j])%mod;
return res;
}
friend matrix operator + (const matrix A,const matrix B)
{
matrix res;
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
res.data[i][j]=(A.data[i][j]+B.data[i][j])%mod;
return res;
}
friend matrix operator - (const matrix A,const matrix B)
{
matrix res;
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
res.data[i][j]=((A.data[i][j]-B.data[i][j])+mod)%mod;
return res;
}
void print()
{
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
printf("%I64d ",data[i][j]);
puts("");
}
} }E,zero;
struct supermax
{
matrix ret[N][N];
friend supermax operator * (supermax A,supermax B)
{
supermax res;
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
res.ret[i][j]=zero; for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
for(int k=0;k<N;k++)
{
res.ret[i][j]=res.ret[i][j]+(A.ret[i][k]*B.ret[k][j]);
for(int p=0;p<N;p++)
for(int q=0;q<N;q++)
res.ret[i][j].data[p][q]%=mod;
}
return res;
}
}; matrix matmod(matrix origin,LL n)
{
matrix res=E; while(n)
{
if(n&1)
res=res*origin;
n>>=1;
origin=origin*origin;
}
return res;
}
supermax Do(supermax origin,LL n)
{
supermax res;
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
res.ret[i][j]=zero;
for(int i=0;i<N;i++)
res.ret[i][i]=E; while(n)
{
if(n&1)
res=res*origin;
n>>=1;
origin=origin*origin;
}
return res;
}
int main()
{
memset(zero.data,0,sizeof zero.data);
memset(E.data,0,sizeof E.data);
for(int i=0;i<N;i++)
E.data[i][i]=1; LL k,b,n;
while(scanf("%I64d%I64d%I64d%I64d",&k,&b,&n,&mod)!=EOF)
{
matrix fib;
fib.data[0][0]=1;
fib.data[0][1]=1;
fib.data[1][0]=1;
fib.data[1][1]=0; matrix K=matmod(fib,k); supermax o;
o.ret[0][0]=E;
o.ret[0][1]=E;
o.ret[1][0]=zero;
o.ret[1][1]=K; supermax final=Do(o,n); matrix tmp=(final.ret[0][0]*zero)+(final.ret[0][1]*E); matrix B=matmod(fib,b);
matrix fibb,fib0;
fib0.data[0][0]=1;
fib0.data[1][0]=0;
fib0.data[0][1]=fib0.data[1][1]=0;
fibb=B*fib0; matrix ans = tmp*fibb;
printf("%I64d\n",ans.data[1][0]%mod);
}
return 0;
}

hdu 1588 Gauss Fibonacci(矩阵嵌矩阵)的更多相关文章

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

    HDU 1588 Gauss Fibonacci(矩阵高速幂+二分等比序列求和) ACM 题目地址:HDU 1588 Gauss Fibonacci 题意:  g(i)=k*i+b;i为变量.  给出 ...

  2. HDU - 1588 Gauss Fibonacci (矩阵高速幂+二分求等比数列和)

    Description Without expecting, Angel replied quickly.She says: "I'v heard that you'r a very cle ...

  3. HDU 1588 Gauss Fibonacci(矩阵快速幂)

    Gauss Fibonacci Time Limit: 3000/1000 MS (Java/Others)     Memory Limit: 32768/32768 K (Java/Others) ...

  4. HDU:Gauss Fibonacci(矩阵快速幂+二分)

    http://acm.hdu.edu.cn/showproblem.php?pid=1588 Problem Description Without expecting, Angel replied ...

  5. hdu 1588(Fibonacci矩阵求和)

    题目的大意就是求等差数列对应的Fibonacci数值的和,容易知道Fibonacci对应的矩阵为[1,1,1,0],因为题目中f[0]=0,f[1]=1,所以推出最后结果f[n]=(A^n-1).a, ...

  6. 【HDU 2855】 Fibonacci Check-up (矩阵乘法)

    Fibonacci Check-up Problem Description Every ALPC has his own alpc-number just like alpc12, alpc55, ...

  7. POJ3233]Matrix Power Series && [HDU1588]Gauss Fibonacci

    题目:Matrix Power Series 传送门:http://poj.org/problem?id=3233 分析: 方法一:引用Matrix67大佬的矩阵十题:这道题两次二分,相当经典.首先我 ...

  8. hdu 1588(矩阵好题+递归求解等比数列)

    Gauss Fibonacci Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  9. HDU 5411 CRB and puzzle (Dp + 矩阵高速幂)

    CRB and Puzzle Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) T ...

随机推荐

  1. Hadoop集群管理--保证集群平稳地执行

    本篇介绍为了保证Hadoop集群平稳地执行.须要深入掌握的知识.以及一些管理监控的手段,日常维护的工作. HDFS 永久性数据结构 对于管理员来说.深入了解namenode,辅助namecode和da ...

  2. IOS &#39;NSInternalInconsistencyException&#39;

    今天想写一个请求的天气.好的.废话不多说.先贴代码: 使用AFNetWorking 发送get请求,可是一直报错  IOS 'NSInternalInconsistencyException', re ...

  3. windows下用ADT进行android NDK开发的具体教程(从环境搭建、配置到编译全过程)

    郑重申明:如需转载本博客,请注明出处,谢谢! 这几天在学习android NDK的开发.那么首先让我们来看看android NDK开发的本质是什么. NDK(Native Development Ki ...

  4. Integer 和 int的种种比较

    public static void main(String[] args) { int i = 128; Integer i2 = 128; Integer i3 = new Integer(128 ...

  5. Spring MVC 入门

    1.准备开发环境和运行环境: ☆开发工具:eclipse ☆运行环境:tomcat6.0.20 ☆工程:动态web工程(springmvc-chapter2) ☆spring框架下载: spring- ...

  6. spring security源码分析心得

    看了半天的文档及源码,终于理出了spring-security的一些总体思路,spring security主要分认证(authentication)和授权(authority). 1.认证authe ...

  7. tomcat安装部署

    1.tomcat6 下载地址 http://tomcat.apache.org/download-60.cgi 下载的话,下载那个.tar.gz后缀名的即可. 好像在 Linux.Unix上tomca ...

  8. noip 2018 day2 T1 旅行 基环树 tarjan

    Code: #include<cstdio> #include<cstring> #include<string> #include<stack> #i ...

  9. jquery autocomplete文本自己主动补全

    文本自己主动补全功能确实非常有用. 先看下简单的效果:(样式不咋会写) 以下介绍几种: 1:jqery-actocomplete.js 这个网上有个写好的实例,上面挺具体的,能够下来执行下就清楚了就不 ...

  10. DataTable填充实体类返回泛型集合

    昨天找坤哥看到我的一段代码.例如以下: 略微解释下,这段代码时D层查询结束后,将datatable查询到的结果赋值给实体对象的属性,然后返回实体的过程.坤哥看了之后问我.假设实体有500多个属性.难道 ...