题目链接:传送门

题目大意:

  求斐波那契数列第n项F(n)。

  (F(0) = 0, F(1) = 1, 0 ≤ n ≤ 109

思路:

  用矩阵乘法加速递推。

算法竞赛进阶指南的模板:

  1. #include <iostream>
  2. #include <cstring>
  3.  
  4. using namespace std;
  5. const int MOD = ;
  6.  
  7. void mul(int f[], int base[][]) {
  8. int c[];
  9. memset(c, , sizeof c);
  10. for (int j = ; j < ; j++) {
  11. for (int k = ; k < ; k++) {
  12. c[j] = (c[j] + 1LL * f[k] * base[k][j]) % MOD;
  13. }
  14. }
  15. memcpy(f, c, sizeof c);
  16. }
  17. void mulself(int base[][]) {
  18. int c[][];
  19. memset(c, , sizeof c);
  20. for (int i = ; i < ; i++)
  21. for (int j = ; j < ; j++)
  22. for (int k = ; k < ; k++)
  23. c[i][j] = (c[i][j] + 1LL*base[i][k]*base[k][j]) % MOD;
  24. memcpy(a, c, sizeof c);
  25. }
  26.  
  27. int main()
  28. {
  29. int n;
  30. while (cin >> n && n != -) {
  31. int f[] = {, };
  32. int base[][] = {{, }, {, }};
  33. for (; n; n >>= ) {
  34. if (n & ) mul(f, base);
  35. mulself(base);
  36. }
  37. cout << f[] << endl;
  38. }
  39. return ;
  40. }

蒟蒻的模板:

  1. #include <cstdio>
  2. #include <iostream>
  3. #include <cstring>
  4.  
  5. using namespace std;
  6. typedef long long ll;
  7. const int MOD = 1e4;
  8. const int MAXN = ;
  9. struct Matrix{
  10. int mat[MAXN][MAXN];
  11. Matrix operator * (Matrix const& b) const {
  12. Matrix res;
  13. memset(res.mat, , sizeof res.mat);
  14. for (int i = ; i < MAXN; i++)
  15. for (int j = ; j < MAXN; j++)
  16. for (int k = ; k < MAXN; k++)
  17. res.mat[i][j] = (res.mat[i][j] + this->mat[i][k] * b.mat[k][j])%MOD;
  18. return res;
  19. }
  20. }base, F0, FN;
  21. Matrix fpow(Matrix base, ll n) {
  22. Matrix res;
  23. memset(res.mat, , sizeof res.mat);
  24. for (int i = ; i < MAXN; i++)
  25. res.mat[i][i] = ;
  26. while (n) {
  27. if (n&) res = res*base;
  28. base = base * base;
  29. n >>= ;
  30. }
  31. return res;
  32. }
  33. void init()
  34. {
  35. base.mat[][] = ; base.mat[][] = ;
  36. base.mat[][] = ; base.mat[][] = ;
  37. memset(F0.mat, , sizeof F0.mat);
  38. F0.mat[][] = ; F0.mat[][] = ;
  39. }
  40.  
  41. int main()
  42. {
  43. int N;
  44. while (cin >> N) {
  45. if (N == -)
  46. break;
  47. init();
  48. FN = fpow(base, N);
  49. cout << FN.mat[][] << endl;
  50. }
  51. return ;
  52. }

POJ3070 Fibonacci(矩阵快速幂加速递推)【模板题】的更多相关文章

  1. HDU 5950 - Recursive sequence - [矩阵快速幂加速递推][2016ACM/ICPC亚洲区沈阳站 Problem C]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5950 Farmer John likes to play mathematics games with ...

  2. CH 3401 - 石头游戏 - [矩阵快速幂加速递推]

    题目链接:传送门 描述石头游戏在一个 $n$ 行 $m$ 列 ($1 \le n,m \le 8$) 的网格上进行,每个格子对应一种操作序列,操作序列至多有 $10$ 种,分别用 $0 \sim 9$ ...

  3. HDU 1757 矩阵快速幂加速递推

    题意: 已知: 当x<10时:f(x)=x 否则:f(x) = a0 * f(x-1) + a1 * f(x-2) + a2 * f(x-3) + --+ a9 * f(x-10); 求:f(x ...

  4. HDU5950 Recursive sequence (矩阵快速幂加速递推) (2016ACM/ICPC亚洲赛区沈阳站 Problem C)

    题目链接:传送门 题目: Recursive sequence Time Limit: / MS (Java/Others) Memory Limit: / K (Java/Others) Total ...

  5. CH3401 石头游戏(矩阵快速幂加速递推)

    题目链接:传送门 题目: 石头游戏 0x30「数学知识」例题 描述 石头游戏在一个 n 行 m 列 (≤n,m≤) 的网格上进行,每个格子对应一种操作序列,操作序列至多有10种,分别用0~9这10个数 ...

  6. 洛谷P1357 花园(状态压缩 + 矩阵快速幂加速递推)

    题目链接:传送门 题目: 题目描述 小L有一座环形花园,沿花园的顺时针方向,他把各个花圃编号为1~N(<=N<=^).他的环形花园每天都会换一个新花样,但他的花园都不外乎一个规则,任意相邻 ...

  7. [bzoj1008](HNOI2008)越狱(矩阵快速幂加速递推)

    Description 监狱有连续编号为1...N的N个房间,每个房间关押一个犯人,有M种宗教,每个犯人可能信仰其中一种.如果相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱 In ...

  8. [bzoj1009](HNOI2008)GT考试 (kmp+矩阵快速幂加速递推)

    Description 阿 申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字.他的不吉利数学 A1A2...Am(0&l ...

  9. 2019.2.25考试T1, 矩阵快速幂加速递推+单位根反演(容斥)

    \(\color{#0066ff}{题解}\) 然后a,b,c通过矩阵加速即可 为什么1出现偶数次3没出现的贡献是上面画绿线的部分呢? 考虑暴力统计这部分贡献,答案为\(\begin{aligned} ...

随机推荐

  1. pre强制 自动换行

    转自:http://www.16sucai.com/2010/10/941.html <pre> 元素可定义预格式化的文本.被包围在 pre 元素中的文本通常会保留空格和换行符.而文本也会 ...

  2. Javaconfig形式配置Dubbo多注册中心

    多注册中心,一般用不到,但是某些情况下的确能解决不少问题,可以将某些dubbo服务注册到2套dubbo系统中,实现服务在2套系统间的共用. 网上的配置说明很多,但包括dubbo官方说明文档都是以xml ...

  3. shell 通配符

    Bash中的通配符 '?' 匹配一个任意字符 '*' 匹配0个或任意多个字符,也就是可以匹配任何内容 '[]' 匹配括号中任意一个字符.例如[abc]代表一定匹配一个字符,或者是a,或者是b,或者是c ...

  4. 你应该这样理解JVM内存管理

    在进行Java程序设计时,一般不涉及内存的分配和内存回收的相关代码,此处引用一句话: Java和C++之间存在一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外的人想进去,墙里面的人想出来 ,个人从这 ...

  5. InterBase 数据库与驱动 版本不同

    [Window Title] Project1 - Delphi 10.1 Berlin - Unit1 [Content] Failed: "unsupported on-disk str ...

  6. day35 数据库介绍和初识sql

    今日内容: 1. 代码: 简易版socketsever 2.数据库(mysql)简单介绍和分类介绍 3.mysql root修改密码 4.修改字符集编码 5.初识sql语句 1.简易版socketse ...

  7. VSTO:使用C#开发Excel、Word【9】

    文件背后的代码VSTO支持文档背后的代码,要求开发人员使用VSTO项目中生成的具有预连接上下文和预连接事件的类.这些类有时被称为“代码后面”类,因为它们是与特定文档或工作表相关联的代码.在Word中, ...

  8. 50个常用的Linux命令

    1.tar tar -xvf archive_name.tar  解压文件 tar -cvf archive_name.tar file 把文件file压缩成archive_name.tar tar ...

  9. CentOS7安装Nginx及配置

    Nginx是一款轻量级的网页服务器.反向代理服务器.相较于Apache.lighttpd具有占有内存少,稳定性高等优势.**它最常的用途是提供反向代理服务.** 安装   在Centos下,yum源不 ...

  10. 特殊权限stick_bit

    stick_bit 防删除位:文件是否可以被某用户删除,主要取决于该文件所在的目录是否对该用户具有写权限.如果没有写权限,则这个目录下的所有文件都不能删除,同时也不能添加新的文件.如果希望用户能够添加 ...