题意:
      给你一个关系式,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代码


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

__int64 MOD1 = 183120;
__int64 MOD2 = 222222224;
__int64 MOD3 = 1000000007;__int64 MOD;
typedef struct
{__int64 mat[5][5];
}A;A mat_mat(A a ,A b)
{A c;memset(c.mat ,0 ,sizeof(c.mat));for(int k = 1 ;k <= 2 ;k ++)for(int i = 1 ;i <= 2 ;i ++)if(a.mat[i][k])for(int j = 1 ;j <= 2 ;j ++)c.mat[i][j] = (c.mat[i][j] + a.mat[i][k]  * b.mat[k][j]) % MOD;return c;
} A quick_mat(A a ,__int64 b)
{A c;memset(c.mat ,0 ,sizeof(c.mat));c.mat[1][1] = c.mat[2][2] = 1;while(b){if(b & 1) c = mat_mat(c ,a);a = mat_mat(a ,a);b >>= 1;}return c;
}int main ()
{__int64 n ,i;A aa ,bb;aa.mat[1][1] = 0 ,aa.mat[1][2] = 1;aa.mat[2][1] = 1 ,aa.mat[2][2] = 3;while(~scanf("%I64d" ,&n)){if(n == 0){printf("0\n");continue;}if(n == 1){printf("1\n");continue;}MOD = MOD1;bb = quick_mat(aa ,n - 1);n = (0 * bb.mat[1][2] + 1 * bb.mat[2][2])% MOD;if(n == 0){printf("0\n");continue;}if(n == 1){printf("1\n");continue;}MOD = MOD2;bb = quick_mat(aa ,n - 1);n = (0 * bb.mat[1][2] + 1 * bb.mat[2][2])% MOD;if(n == 0){printf("0\n");continue;}if(n == 1){printf("1\n");continue;}MOD = MOD3;bb = quick_mat(aa ,n - 1);n = (0 * bb.mat[1][2] + 1 * bb.mat[2][2])% MOD;printf("%I64d\n" ,n);}return 0;
}





hdu4291 暴力循环节+矩阵快速幂相关推荐

  1. hdu 5451 Best Solver 矩阵循环群+矩阵快速幂

    http://acm.hdu.edu.cn/showproblem.php?pid=5451 题意:给定x    求解 思路: 由斐波那契数列的两种表示方法, 之后可以转化为 线性表示 F[n] = ...

  2. 矩阵快速幂的一份小结

    矩阵真是个好东西!虽然矩乘的复杂度有点难看... ... 这几天也做了不少矩阵题目,还是有几道好题目的.不过我打算从入门开始. 矩阵乘法:A[i][k]*B[k][j]=C[i][j];(A的第i行的 ...

  3. HDU - 6185 Covering(暴搜+递推+矩阵快速幂/杜教BM)

    题目链接:点击查看 题目大意:规定宽度为4,给定长度为n,求用1*2和2*1的瓷砖,将其完全铺满能有多少种方法. 分析:自从学会了矩阵快速幂之后,看到1e18的数据量都会下意识的往递推上面想,但是以前 ...

  4. 矩阵快速幂(矩阵加速)

    //南昌理工ACM集训队 放心食用 矩阵加速 快速幂(前置技能) 矩阵快速幂 可乐 附个模板 最后小结 本人小白如有不对欢迎指正ლ(╹◡╹ლ) 矩阵加速 快速幂(前置技能) 对于普通的求a的b次方,一 ...

  5. [BJOI2017]魔法咒语(AC自动机+DP+矩阵快速幂)

    文章目录 title solution code title solution 针对数据编程才是坠吊的!!! 观察数据,发现分隔数据的 L L L跨度过大,没有衔接--推测很有可能是分数据做法 ①:考 ...

  6. 2015多校10 1006.CRB and Puzzle HDU5411(邻接矩阵求k长路条数,矩阵快速幂

    题意:有若干字符,现在要把它们连成一个字符串,每种字符后面只能接特定种类的字符,现在询问能连接出的长度小于等于m的字符串有多少种. 思路:我们可以把这个转移关系看成一个图,如果字符a后面可以接b,那么 ...

  7. POJ3070矩阵快速幂简单题

    题意:       求斐波那契后四位,n <= 1,000,000,000. 思路:        简单矩阵快速幂,好久没刷矩阵题了,先找个最简单的练练手,总结下矩阵推理过程,其实比较简单,关键 ...

  8. hdu2604 矩阵快速幂

    题意:       给你n个人,排成一个长度是n的队伍,人只有两类f,m,问可以有多少种排法使度列中不出现fff,fmf这样的子串. 思路:       一开始暴力,结果超时了,其实这个题目要是能找到 ...

  9. 一文彻底搞懂快速幂(原理、实现、矩阵快速幂)

    前言 大家好,我是bigsai,之前有个小老弟问到一个剑指offer一道相关快速幂的题,这里梳理一下讲一下快速幂! 快速幂是什么? 顾名思义,快速幂就是快速算底数的n次幂.你可能疑问,求n次幂算n次叠 ...

最新文章

  1. 哈佛图书馆墙上的训言
  2. python3 列表倒叙_python的列表、元组、字典、集合
  3. PLSQL的DBMS_GETLINE
  4. 计网期末复习 - 发送时延和传播时延计算
  5. 定时执行失败原因分析
  6. pku1088----滑雪(记忆性搜索)
  7. 玻纤效应差分信号影响及处理方法,使用sigrity建模玻纤效应仿真
  8. 摄像头在未来自动驾驶中的商业化落地方案
  9. 二代旅游CMS网站管理系统使用手册(三)--计调线路团期录入
  10. 现代互联网的网络拓扑
  11. 编程中的幂等性 —— HTTP幂等性
  12. ENSP 防火墙USG6000V NAT 设置(全场景)
  13. java写入word文件_使用JAVA写入word文件
  14. iOS --- OpenGLES之图片纹理
  15. uniapp表单验证
  16. 6年拉力工作经验,学了阿里P8级架构师的7+1+1落地项目,跳槽阿里年薪直接40W+
  17. 如何使用计算器正确计算机,计算器的使用方法
  18. 【游戏测试】用 python 写个自动拉取手机或模拟器游戏 log 到本地的工具
  19. 这一路~~jncip
  20. CSS实现内容旋转向下移动的动画效果

热门文章

  1. Nginx三部曲之一【配置文件详解】
  2. VC++软件工程师高端培训
  3. benet 3.0的构建企业网络视频第二章地址
  4. SQL SERVER2000教程-第四章 创建和维护表 第二节 数据完整性
  5. 【对比分析四】position的absolute与fixed共同点与不同点
  6. 网易笔试——混合颜料
  7. iOS 集成银联支付swift
  8. Oracle11g R2学习系列 之六数据库链接,快照及序列
  9. DescriptionAttribute Class
  10. django 自定义simple_tag,filter