博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 1588 Gauss Fibonacci
阅读量:7060 次
发布时间:2019-06-28

本文共 1984 字,大约阅读时间需要 6 分钟。

HDU_1588

    不妨设F为像下图一样的含有fibonacci项的矩阵,那么最后结果就是矩阵S(n-1)=F^(b)+F^(k+b)+…+F^(k*(n-1)+b)左上角的元素。

    对于矩阵S和F,可以得到递推公式S(n)=S(n-1)+F^(k*n+b),F^(k*(n+1)+b)=A^(k)*F^(k*n+b),矩阵A为下图所示的矩阵。于是我们就可以将这个两个递推式构造成一个递推关系的矩阵,然后再用二分矩阵的方法快速求得S(n-1)即可。

    

 

#include
#include
#define MAXD 8int K, B, N, M;struct Matrix{ int a[MAXD][MAXD]; Matrix() { memset(a, 0, sizeof(a)); }};Matrix multiply(Matrix &x, Matrix &y){ int i, j, k; Matrix z; for(k = 0; k < 8; k ++) for(i = 0; i < 8; i ++) if(x.a[i][k]) { for(j = 0; j < 8; j ++) if(y.a[k][j]) z.a[i][j] = (z.a[i][j] + (long long)x.a[i][k] * y.a[k][j]) % M; } return z;}Matrix powmod(Matrix &unit, Matrix &mat, int n){ while(n) { if(n & 1) unit = multiply(mat, unit); n >>= 1; mat = multiply(mat, mat); } return unit;}Matrix getF(int n){ Matrix unit, mat; unit.a[0][0] = 1; mat.a[0][0] = mat.a[0][1] = mat.a[1][0] = 1; powmod(unit, mat, n - 1); return unit;}Matrix getA(int n){ Matrix unit, mat; unit.a[0][0] = unit.a[1][1] = 1; mat.a[0][0] = mat.a[0][1] = mat.a[1][0] = 1; unit = powmod(unit, mat, n); return unit;}void solve(){ int i, j; Matrix unit, mat, Ak, Ab, Akb; if(B) { Ab = getF(B); for(i = 0; i < 4; i ++) for(j = 0; j < 4; j ++) unit.a[i][j] = Ab.a[i][j]; } if(K + B) { Akb = getF(B + K); for(i = 0; i < 4; i ++) for(j = 0; j < 4; j ++) unit.a[i + 4][j] = Akb.a[i][j]; } for(i = 0; i < 4; i ++) mat.a[i][i] = mat.a[i][i + 4] = 1; Ak = getA(K); for(i = 0; i < 4; i ++) for(j = 0; j < 4; j ++) mat.a[i + 4][j + 4] = Ak.a[i][j]; unit = powmod(unit, mat, N - 1); printf("%d\n", unit.a[0][0]);}int main(){ while(scanf("%d%d%d%d", &K, &B, &N, &M) == 4) { solve(); } return 0;}

 

 

转载地址:http://dwfll.baihongyu.com/

你可能感兴趣的文章
DNS服务器在企业中的应用
查看>>
mysql主主复制+keepalived实现高可用
查看>>
Python学习笔记(二)——Python类型
查看>>
Hibernate入门一
查看>>
OpenStack(Queens版)高集群-3.高可用配置(pacemaker&haproxy)
查看>>
Web troubleshooting分析常用的命令
查看>>
我的友情链接
查看>>
smartsvn学习(二)如何在Xcode下使用SVN
查看>>
shell脚本:lvs启动简易脚本
查看>>
Core Motion框架使用方法
查看>>
centOS 安装gitlab
查看>>
我的友情链接
查看>>
二维条码防伪封签是怎样进行防伪的
查看>>
今天,让Mac更好用!
查看>>
Nginx 反向代理配置及403出现原因
查看>>
64位Fedora运行32位C++程序所需的类库
查看>>
Linux 第36,37天 team,taskset,pmap
查看>>
探究施乐打印机新功能
查看>>
简单道理
查看>>
linux下查看自己公网IP
查看>>