题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4291

题目意思:求g(g(g(n))) mod 109 + 7,其中g(n) = 3g(n - 1) + g(n - 2),g(1) = 1,g(0) = 0。

思路:一个很简单的矩阵快速幂,简单的想法就是先用n算出g(n),然后再算g(g(n)),然后再算最外层,都是mod(1e9+7),这么做就错了,这道题有一个循环节的问题,看来这种嵌套的递推式取mod是存在循环节的,以后要注意下。

计算循环节的代码(貌似方法叫做弗洛伊德判圈法?):

 #include <cstdio>
#include <iostream>
using namespace std;
#define LL __int64
LL mod=1e9+;
int main()
{
LL i,a,b,g;
a=,b=;
for(i=;;i++)
{
g=(*a+b)%mod;
b=a;
a=g;
if(a==&&b==)
{
if(i!=mod) {mod=i;}
else break;
cout<<i<<endl;
i=;
}
}
return ;
}

代码:

 #include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std; typedef __int64 int64;
const int N = ; int64 n;
struct Matrix{
int64 mat[N][N];
int64 MOD;
Matrix operator*(const Matrix& m)const{
Matrix tmp;
tmp.MOD = MOD;
for(int i = ; i < N ; i++){
for(int j = ; j < N ; j++){
tmp.mat[i][j] = ;
for(int k = ; k < N ; k++)
tmp.mat[i][j] += mat[i][k]*m.mat[k][j]%MOD;
tmp.mat[i][j] %= MOD;
}
}
return tmp;
}
}; int64 Pow(Matrix m , int64 x , int64 MOD){
if(x <= ) return x;
Matrix ans;
ans.MOD = m.MOD = MOD;
ans.mat[][] = ans.mat[][] = ;
ans.mat[][] = ans.mat[][] = ;
x--;
while(x){
if(x%)
ans = ans*m;
x /= ;
m = m*m;
}
return ans.mat[][]%MOD;
} // 暴力找到循环节
int64 getLoop(int64 MOD){
int64 pre1 = ;
int64 pre2 = ;
for(int64 i = ; ; i++){
int64 x = *pre1%MOD+pre2%MOD;
x %= MOD;
// update
pre2 = pre1;
pre1 = x;
int64 y = *pre1%MOD+pre2%MOD;
if(x == && y == ){
return i;
}
}
} int main(){
int64 L1 = 1e9+;
int64 L2 = ;
int64 L3 = ;
Matrix m;
m.mat[][] = ; m.mat[][] = ;
m.mat[][] = ; m.mat[][] = ;
while(scanf("%I64d" , &n) != EOF){
int64 x = Pow(m , n , L3);
int64 y = Pow(m , x , L2);
int64 ans = Pow(m , y , L1);
printf("%I64d\n" , ans);
}
return ;
}

HDU4291—A Short problem的更多相关文章

  1. HDU----(4291)A Short problem(快速矩阵幂)

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

  2. hdu4291 A Short problem

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission ...

  3. hdu 4291 A Short problem(矩阵+取模循环节)

    A Short problem                                                          Time Limit: 2000/1000 MS (J ...

  4. HDU 4291 A Short problem(2012 ACM/ICPC Asia Regional Chengdu Online)

    HDU 4291 A Short problem(2012 ACM/ICPC Asia Regional Chengdu Online) 题目链接http://acm.hdu.edu.cn/showp ...

  5. HDU 4291 A Short problem(矩阵+循环节)

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

  6. FZU2013 A short problem —— 线段树/树状数组 + 前缀和

    题目链接:https://vjudge.net/problem/FZU-2013  Problem 2013 A short problem Accept: 356    Submit: 1083Ti ...

  7. HDU——4291A Short problem(矩阵快速幂+循环节)

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

  8. 贪心 FZU 2013 A short problem

    题目传送门 /* 题意:取长度不小于m的序列使得和最大 贪心:先来一个前缀和,只要长度不小于m,从m开始,更新起点k最小值和ans最大值 */ #include <cstdio> #inc ...

  9. 循环节 + 矩阵快速幂 - 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), ...

随机推荐

  1. CentOS搭建Nginx+Subversion环境(包括多个版本库的配置)

    Apache Subversion(简称SVN,svn) 因为某种原因我们需要用Nginx作为Subversion的http前端,但目前没有现成的Nginx+Subversion搭配方式. 而Subv ...

  2. [kernel]内核日志及printk结构分析

    一直都知道内核printk分级机制,但是没有去了解过,前段时间和一个同事聊到开机启动打印太多,只需要设置一下等级即可:另外今天看驱动源码,也看到类似于Printk(KERN_ERR "... ...

  3. inline-block元素的空白间距解决方法<转>

    使用inline-block来代替float进行布局,或者使用inline-block来实现元素的居中效果.有关于使用inline-block来代替float的讨论也蛮多的. 不过就是使用inline ...

  4. java线程池的应用浅析

    import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader; import java ...

  5. JVM调优浅谈(转)

    1.数据类型 java虚拟机中,数据类型可以分为两类:基本类型和引用类型.基本类型的变量保存原始值,即:它代表的值就是数值本身,而引用类型的变量保存引用值.“引用值”代表了某个对象的引用,而不是对象本 ...

  6. 树链剖分 + 后缀数组 - E. Misha and LCP on Tree

    E. Misha and LCP on Tree Problem's Link Mean: 给出一棵树,每个结点上有一个字母.每个询问给出两个路径,问这两个路径的串的最长公共前缀. analyse: ...

  7. 数据库 Proc编程二

    #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <stri ...

  8. ubuntu16.04 安装opencv3.2.0以及opencv_contrib-3.2.0

    1.需要的包:sudo apt-get install build-essentialsudo apt-get install cmake git libgtk2.0-dev pkg-config l ...

  9. 通过Hadoop安全部署经验总结,开发出以下十大建议,以确保大型和复杂多样环境下的数据信息安全。

    通过Hadoop安全部署经验总结,开发出以下十大建议,以确保大型和复杂多样环境下的数据信息安全. 1.先下手为强!在规划部署阶段就确定数据的隐私保护策略,最好是在将数据放入到Hadoop之前就确定好保 ...

  10. SSH三大框架的知识题

    Struts 谈谈你对Struts的理解. 答: 1.struts是一个按MVC模式设计的Web层框架,其实它就是一个大大的servlet,这个Servlet名为ActionServlet,或是Act ...