hdu 1588 Gauss Fibonacci(矩阵嵌矩阵)
题目大意:
求出斐波那契中的 第 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(矩阵嵌矩阵)的更多相关文章
- HDU 1588 Gauss Fibonacci(矩阵高速幂+二分等比序列求和)
HDU 1588 Gauss Fibonacci(矩阵高速幂+二分等比序列求和) ACM 题目地址:HDU 1588 Gauss Fibonacci 题意: g(i)=k*i+b;i为变量. 给出 ...
- HDU - 1588 Gauss Fibonacci (矩阵高速幂+二分求等比数列和)
Description Without expecting, Angel replied quickly.She says: "I'v heard that you'r a very cle ...
- HDU 1588 Gauss Fibonacci(矩阵快速幂)
Gauss Fibonacci Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- HDU:Gauss Fibonacci(矩阵快速幂+二分)
http://acm.hdu.edu.cn/showproblem.php?pid=1588 Problem Description Without expecting, Angel replied ...
- hdu 1588(Fibonacci矩阵求和)
题目的大意就是求等差数列对应的Fibonacci数值的和,容易知道Fibonacci对应的矩阵为[1,1,1,0],因为题目中f[0]=0,f[1]=1,所以推出最后结果f[n]=(A^n-1).a, ...
- 【HDU 2855】 Fibonacci Check-up (矩阵乘法)
Fibonacci Check-up Problem Description Every ALPC has his own alpc-number just like alpc12, alpc55, ...
- POJ3233]Matrix Power Series && [HDU1588]Gauss Fibonacci
题目:Matrix Power Series 传送门:http://poj.org/problem?id=3233 分析: 方法一:引用Matrix67大佬的矩阵十题:这道题两次二分,相当经典.首先我 ...
- hdu 1588(矩阵好题+递归求解等比数列)
Gauss Fibonacci Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- HDU 5411 CRB and puzzle (Dp + 矩阵高速幂)
CRB and Puzzle Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) T ...
随机推荐
- python -迭代器与生成器 以及 iterable(可迭代对象)、yield语句
我刚开始学习编程没多久,对于很多知识还完全不知道,而有些知道的也是一知半解,我想把学习到的知识记录下来,一是弥补记忆力差的毛病,二也是为了待以后知识能进一步理解透彻时再回来做一个补充. 参考链接: 完 ...
- DBCP2配置详细说明(中文翻译)
http://blog.csdn.net/kerafan/article/details/50382998 common-dbcp2数据库连接池参数说明 由于commons-dbcp所用的连接池出现版 ...
- 国庆 day 6 上午
1. 角谷猜想(kakutani.pas/c/cpp)(kakutani.in/out)时间限制:1s/空间限制:256M[题目描述] 某个名字末尾是 654321 的小 A 同学是个大家眼中公认的学 ...
- 安装Signavio Web设计器
在Jbpm3版本号中,这个著名的开源项目并没有基于浏览器的图形化流程设计器,结果导致流程设计一直停留在CS阶段. 比方我之前做过的一个OA项目.项目中採用的就是Jbpm3.因为它不支持在浏览器中的图形 ...
- 一起talk C栗子吧(第八十一回:C语言实例--进程停止)
各位看官们,大家好,上一回中咱们说的是进程相互排斥的样例,这一回咱们说的样例是:进程停止.闲话休提,言归正转. 让我们一起talk C栗子吧! 我们在前面的章回中介绍了怎样创建进程,只是没有介绍停止进 ...
- 字符串匹配:KMP
參考:从头到尾彻底理解KMP 在字符串 str 中 匹配模式串 pattern 1. 计算模式串的 next 数组: 2. 在字符串中匹配模式串:当一个字符匹配时,str[i++], pattern[ ...
- _DataStructure_C_Impl:Dijkstra算法求最短路径
// _DataStructure_C_Impl:Dijkstra #include<stdio.h> #include<stdlib.h> #include<strin ...
- Mysql之索引的基本概念
一.索引是什么? 比如我们要在字典中找某一字,如何才能快速找到呢?那就是通过字典的目录. 对数据库来说,索引的作用就是给‘数据’加目录. 二.索引算法 设有N条随机记录,不用索引,平均查找N/2次,那 ...
- url传递中文的解决方案总结
File文件控件,选中文件(图片,flash,视频)即立即预览显示 .Net刷新页面的几种方式 Attributes.Add用途与用法(C#) url传递中文的解决方案总结 byte[] bytes ...
- Multi-process Resource Loading
For Developers > Design Documents > Multi-process Resource Loading 目录 1 This design doc n ...