题意:

      给你一个关系式,x[n] = 3*x[n-1] + x[n-2],求x(x(x[n]))%1000000007.

思路:

      做这个题目要明确一点,就是对于取余操作大多数时候都会出现循环节的情况,尤其是对于像这个题目的转换公式,数据有规律递增,那么也就是说0 1 1 ....等再次出现0 1的时候也就是一定找了循环节,对于这个题目我们找循环节主要不是为了防止超时,而是为了得到正确的答案,因为x[n]很大的时候就的模拟大数,就麻烦了,我们只要找到每一层的循环节,就能把数据弄小,就可以跑三次矩阵快速A掉这个题目了。

下面给出暴力循环节代码(暴力第二层的,最内层把10..7改成第二层的MOD就行了)

#include<stdio.h>

int main ()

{

   __int64 a = 0 ,b = 1 ,c;

   for(__int64 i = 3 ; ;i ++)

   {

      c = (b * 3 + a)%1000000007;

      a = b ,b = c;

      if(a == 0 && b == 1)

      {

          printf("%I64d\n" ,i - 2);

          break;

      }

   }

   getchar();

   return 0;

}

      

暴力后得到最内侧的MOD = 183120

第二层 MOD = 222222224

最外层给了 MOD = 1000000007

AC代码


  1. #include<stdio.h>
  2. #include<string.h>

  3. __int64 MOD1 = 183120;
  4. __int64 MOD2 = 222222224;
  5. __int64 MOD3 = 1000000007;
  6. __int64 MOD;
  7. typedef struct
  8. {
  9. __int64 mat[5][5];
  10. }A;
  11.  
  12. A mat_mat(A a ,A b)
  13. {
  14. A c;
  15. memset(c.mat ,0 ,sizeof(c.mat));
  16. for(int k = 1 ;k <= 2 ;k ++)
  17. for(int i = 1 ;i <= 2 ;i ++)
  18. if(a.mat[i][k])
  19. for(int j = 1 ;j <= 2 ;j ++)
  20. c.mat[i][j] = (c.mat[i][j] + a.mat[i][k] * b.mat[k][j]) % MOD;
  21. return c;
  22. }
  23.  
  24. A quick_mat(A a ,__int64 b)
  25. {
  26. A c;
  27. memset(c.mat ,0 ,sizeof(c.mat));
  28. c.mat[1][1] = c.mat[2][2] = 1;
  29. while(b)
  30. {
  31. if(b & 1) c = mat_mat(c ,a);
  32. a = mat_mat(a ,a);
  33. b >>= 1;
  34. }
  35. return c;
  36. }
  37. int main ()
  38. {
  39. __int64 n ,i;
  40. A aa ,bb;
  41. aa.mat[1][1] = 0 ,aa.mat[1][2] = 1;
  42. aa.mat[2][1] = 1 ,aa.mat[2][2] = 3;
  43. while(~scanf("%I64d" ,&n))
  44. {
  45. if(n == 0){printf("0\n");continue;}
  46. if(n == 1){printf("1\n");continue;}
  47. MOD = MOD1;
  48. bb = quick_mat(aa ,n - 1);
  49. n = (0 * bb.mat[1][2] + 1 * bb.mat[2][2])% MOD;
  50. if(n == 0){printf("0\n");continue;}
  51. if(n == 1){printf("1\n");continue;}
  52. MOD = MOD2;
  53. bb = quick_mat(aa ,n - 1);
  54. n = (0 * bb.mat[1][2] + 1 * bb.mat[2][2])% MOD;
  55. if(n == 0){printf("0\n");continue;}
  56. if(n == 1){printf("1\n");continue;}
  57. MOD = MOD3;
  58. bb = quick_mat(aa ,n - 1);
  59. n = (0 * bb.mat[1][2] + 1 * bb.mat[2][2])% MOD;
  60.  
  61. printf("%I64d\n" ,n);
  62. }
  63. return 0;
  64. }





hdu4291 暴力循环节+矩阵快速幂的更多相关文章

  1. 循环节 + 矩阵快速幂 - HDU 4291 A Short problem

    A Short problem Problem's Link Mean: 给定一个n,求:g(g(g(n))) % 1000000007 其中:g(n) = 3g(n - 1) + g(n - 2), ...

  2. hdu 5895 Mathematician QSC 指数循环节+矩阵快速幂

    Mathematician QSC Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Othe ...

  3. 2019牛客多校第五场 generator 1——广义斐波那契循环节&&矩阵快速幂

    理论部分 二次剩余 在数论中,整数 $X$ 对整数 $p$ 的二次剩余是指 $X^2$ 除以 $p$ 的余数. 当存在某个 $X$,使得式子 $X^2 \equiv d(mod \ p)$ 成立时,称 ...

  4. HDU - 5451 Best Solver(循环节+矩阵快速幂)

    Best Solver The so-called best problem solver can easily solve this problem, with his/her childhood ...

  5. HDU 1005 Number Sequence【斐波那契数列/循环节找规律/矩阵快速幂/求(A * f(n - 1) + B * f(n - 2)) mod 7】

    Number Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  6. hdu4291之矩阵快速幂

    A Short problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  7. HDU1005 找规律 or 循环点 or 矩阵快速幂

    http://acm.hdu.edu.cn/showproblem.php?pid=1005 1.一开始就注意到了n的数据范围 <=100 000 000,但是还是用普通的循环做的,自然TLE了 ...

  8. CCF 201312-4 有趣的数 (数位DP, 状压DP, 组合数学+暴力枚举, 推公式, 矩阵快速幂)

    问题描述 我们把一个数称为有趣的,当且仅当: 1. 它的数字只包含0, 1, 2, 3,且这四个数字都出现过至少一次. 2. 所有的0都出现在所有的1之前,而所有的2都出现在所有的3之前. 3. 最高 ...

  9. UVaLive 3704 Cellular Automaton (循环矩阵 + 矩阵快速幂)

    题意:一个细胞自动机包含 n 个格子,每个格子取值是 0 ~ m-1,给定距离,则每次操作后每个格子的值将变成到它距离不超过 d 的所有格子在操作之前的值之和取模 m 后的值,其中 i 和 j 的距离 ...

随机推荐

  1. 剑指 Offer 63. 股票的最大利润 + 动态规划

    剑指 Offer 63. 股票的最大利润 Offer_63 题目描述 方法一:暴力法 package com.walegarrett.offer; /** * @Author WaleGarrett ...

  2. HDOJ-4081(次小生成树+Prim算法)

    Qin Shi Huang's National Road System HDOJ-4081 本题考查的是次小生成树的问题,这里的解决方法就是先使用Prim算法求解最小生成树. 在求解最小生成树的时候 ...

  3. .net 开源模板引擎jntemplate 教程:基础篇之语法

    一.基本概念 上一篇我们简单的介绍了jntemplate并写了一个hello world(如果没有看过的,点击查看),本文将继续介绍jntemplate的模板语法. 我们在讲解语法前,首先要了解一下标 ...

  4. ant-design-vue中table自定义列

    1. 使用背景 在项目中使用ant-vue的a-table控件过程中,需要显示序号列或者在列中显示图片,超链,按钮等UI信息.经过查询文档customCell和customRender可以实现以上需求 ...

  5. Java数据持久层

    一.前言 1.持久层 Java数据持久层,其本身是为了实现与数据源进行数据交互的存在,其目的是通过分层架构风格,进行应用&数据的解耦. 我从整体角度,依次阐述JDBC.Mybatis.Myba ...

  6. Mysql给外网IP授权访问

    GRANT ALL PRIVILEGES ON *.* TO 'root'@'58.221.44.174' IDENTIFIED BY 'njqt123456' WITH GRANT OPTION; ...

  7. android分析之mutex

    Android的锁是对Linux锁的一种包装: // ------------------------------------------------------------------------- ...

  8. Windows系统添加虚拟串口及CanToolApp功能1的实现

    项目开始尝试用com0com添加虚拟串口,但是遇到了问题,系统中可以看到添加的虚拟串口,但是用C#无法获取串口.经过多次尝试后,决定换用Virtual Serial Port Driver添加虚拟串口 ...

  9. mysql操作和详解

    温馨提示 mysql安装包里面:mysqld是服务端,mysql是客户端. mysqld其实是SQL后台程序(也就是MySQL服务器),它是关于服务器端的一个程序,mysqld意思是mysql dae ...

  10. C语言之漫谈指针(上)

    C语言之漫谈指针(上) 在C语言学习的途中,我们永远有一个绕不了的坑,那就是--指针. 在这篇文章中我们就谈一谈指针的一些基础知识. 纲要: 零.谈指针之前的小知识 一.指针与指针变量 二.指针变量的 ...