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 ...
随机推荐
- [TJOI2017]城市(树的直径)
[TJOI2017]城市 题目描述 从加里敦大学城市规划专业毕业的小明来到了一个地区城市规划局工作.这个地区一共有ri座城市,<-1条高速公路,保证了任意两运城市之间都可以通过高速公路相互可达, ...
- HDU 4398 Template Library Management (最优页面调度算法)
中等偏易题.操作系统理论中的最优页面调度算法,贪心.当需要淘汰某个模版时,淘汰掉当前手中在最远的将来才会被用到(或者以后永远不再用到)的那个. 代码: #include <iostream> ...
- Unity 编辑器学习(四)之 静态游戏物体
一.Static GameObjects 关于静态对象的信息往往可以预先在编辑器里计算,不需要实时计算,进而优化性能,明显降低DrawCall. 各种Static说明: Lightmapping: 用 ...
- Lesson 1 Basic Concepts: Part 2
Getting your web site ‘live’ on the Web With the nerd background details under our belts, we can now ...
- 直播聊天室,点亮效果,jquery实现
1.css #like_area img{ width: 30px; height: 30px; position: absolute; bottom: 100px; left: 60%; margi ...
- oracle中查询表的信息,包括表名,字段名,字段类型,主键,外键唯一性约束信息
来源于网上整理 总结了一下oracle中查询表的信息,包括表名,字段名,字段类型,主键,外键唯一性约束信息,索引信息查询SQL如下,希望对大家有所帮助: 1.查询出所有的用户表select * fro ...
- Bootstrap Table 的用法
记录下 Bootstrap Table 的用法,备忘. <!DOCTYPE html> <html> <head> <meta charset="u ...
- BZOJ1367: [Baltic2004]sequence(左偏树)
Description Input Output 一个整数R Sample Input 7 9 4 8 20 14 15 18 Sample Output 13 解题思路: 有趣的数学题. 首先确定序 ...
- mysql 5.7 双主+主从配置
mysql5.7安装及赋权 wget http://repo.mysql.com/mysql57-community-release-el7-8.noarch.rpm rpm -ivh mysql57 ...
- tcpg通信
1.客户端 from socket import * def main(): # 创建套接字 tcp_socket = socket(AF_INET,SOCK_STREAM) # 链接服务端 ip = ...