题意:

  给出递推式 g(n) = 3g(n - 1) + g(n - 2),且g(1) = 1,g(0) = 0。求g( g( g(n))) mod 109 + 7。

思路:

  要求的g( g( g(n)))一共里外3层。看到时间限制1s,数据最大10^18,必定不能老实递推,要么有循环,要么用通项公式。这里用通项公式太麻烦了,数字不好算,而g(n)%109 + 7是有规律的, 在n=222222224之后会出现循环,也就是n=0和n=222222224的g(n)是一样的,这是最外层。那么也就是说在g(g(n))=222222224以上时g( g( g(n))) mod 109 + 7会出现循环了,那么g(g(n))应该模222222224再来代进去算。而g(n)%222222224是不是也会有循环的情况?确实,循环点是183120,那么g(n)的范围在0~183119就行了,即g(n)应该模183120。而g(n)%183120是不是还有循环?确实,循环点在240,也就是说n要模240。

  到这已经分析完毕,将输入的n先模240,代入g(n),计算结果(注意要模的是183120)。将结果n再次代入g(n),计算结果(注意要模的是222222224)。将结果n再次代入g(n),计算结果(这次要模的是109 + 7)。这已经是结果。计算过程所用的递推式是一样的,只不过最后取模不一样而已。n%222222224仍然很大,用矩阵快速幂函就行了。

 #include<bits/stdc++.h>
#define LL long long
using namespace std;
const LL mod1=;
const LL mod2=;
const LL mod3=; struct mar
{
LL a[];
}ta,b,t1; mar mul(mar &a,mar &b,LL &mod)
{
mar t;
t.a[]= (a.a[]*b.a[]%mod+ a.a[]*b.a[]%mod)%mod;
t.a[]= (a.a[]*b.a[]%mod+ a.a[]*b.a[]%mod)%mod;
t.a[]= (a.a[]*b.a[]%mod+ a.a[]*b.a[]%mod)%mod;
t.a[]= (a.a[]*b.a[]%mod+ a.a[]*b.a[]%mod)%mod;
return t;
} LL quick_pow(LL &n,LL mod)
{
n--; //只需要n-1个即可
b=ta;
t1.a[]=t1.a[]=; t1.a[]=t1.a[]=; while(n>)
{
if(n&==) t1=mul(t1,b,mod);
b=mul(b,b,mod);
n>>=;
}
return t1.a[]%mod;
}
int main()
{ ta.a[]=;ta.a[]=;ta.a[]=;ta.a[]=;
LL n;
//freopen("input.txt","r",stdin);
while(~scanf("%lld",&n))
{
n%=;
if(!n)
{
printf("0\n");
continue;
}
n=quick_pow(n, mod3);
n=quick_pow(n, mod2);
n=quick_pow(n, mod1);
printf("%lld\n",n);
} return ;
}

AC代码

HDU 4291 A Short problem 短问题 (递推,找规律)的更多相关文章

  1. 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 ...

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

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

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

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

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

  5. MT【103】二阶递推找规律

    评:如果直接找$a_n$的二阶递推式:$a_{n+2}-2\sqrt{2}a_{n+1}-a_n=0$有根号,不利于估计尾数.

  6. codeforces 353D 递推 找规律

    题意:一组男生女生在排队,每秒钟所有排在女生左边的男生与她相邻的女生交换位置,求女生全部换到男生前面的时间. 思路: 解法一:队伍最前面的那些女生不需要交换,后面的女生有两种状态:畅通无阻,前一个女生 ...

  7. hdu 4291 A Short problem

    数学题,找循环节!! 首先g(g(g(n)))=g(x) mod 1e9+7 则可知x有循环节1e9+7; 之后x=g(g(n)),则可算出g(n)的循环节,在算出n的循环节就可以了!! 代码如下: ...

  8. UVALive - 6577 Binary Tree 递推+找规律

    题目链接: http://acm.hust.edu.cn/vjudge/problem/48421 Binary Tree Time Limit: 3000MS 问题描述 Binary Tree is ...

  9. C. Tennis Championship dp递推 || 找规律

    http://codeforces.com/contest/735/problem/C C. Tennis Championship time limit per test 2 seconds mem ...

随机推荐

  1. android项目源码

    [置顶] Android精品开源项目整理_V20140221(持续更新中..) 让我们回顾下2013年有哪些精品资源:Android精品开源项目整理_V20131115(持续更新中..) 引言:   ...

  2. PICO 中关于时基ps3000aGetTimebase函数介绍

  3. Java编程环境eclipse配置

    一. 下载并安装JDK https://www.cnblogs.com/zhangchao0515/p/6806408.html 二.下载并解压Eclipse https://www.cnblogs. ...

  4. Eclipse中导入Hadoop源代码工程

    以hadoop 2.7.3为例, jdk1.7.0_80 , Eclipse Mars(4.5), Apache Maven 3.0.5   mvn时需要使用root权限,即县切换到root用户,用命 ...

  5. Asset Catalog Help (四)---Adding an iOS App Icon Set or Launch Image Set

    Adding an iOS App Icon Set or Launch Image Set Organize different resolutions of your app icons and ...

  6. 2.12 Hivet中order by,sort by、distribute by和cluster by

    https://cwiki.apache.org/confluence/display/Hive/LanguageManual+SortBy 一.order by 对全局数据的排序,仅仅只有一个red ...

  7. LeetCode: 258 Add Digits(easy)

    题目: Given a non-negative integer num, repeatedly add all its digits until the result has only one di ...

  8. LeetCode: 520 Detect Capital(easy)

    题目: Given a word, you need to judge whether the usage of capitals in it is right or not. We define t ...

  9. 洛谷 - P3935 - Calculating - 整除分块

    https://www.luogu.org/fe/problem/P3935 求: \(F(n)=\sum\limits_{i=1}^{n}d(i)\) 枚举因子\(d\),每个因子\(d\)都给其倍 ...

  10. Two sum(给定一个无重复数组和目标值,查找数组中和为目标值的两个数,并输出其下标)

    示例: nums = [1,2,5,7] target = [6] return [0,2] Python解决方案1: def twoSum(nums, target): ""&q ...