HDU 4291 A Short problem 短问题 (递推,找规律)
题意:
给出递推式 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 短问题 (递推,找规律)的更多相关文章
- 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 ...
- hdu 4291 A Short problem(矩阵+取模循环节)
A Short problem Time Limit: 2000/1000 MS (J ...
- 循环节 + 矩阵快速幂 - 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), ...
- HDU 4291 A Short problem(矩阵+循环节)
A Short problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- MT【103】二阶递推找规律
评:如果直接找$a_n$的二阶递推式:$a_{n+2}-2\sqrt{2}a_{n+1}-a_n=0$有根号,不利于估计尾数.
- codeforces 353D 递推 找规律
题意:一组男生女生在排队,每秒钟所有排在女生左边的男生与她相邻的女生交换位置,求女生全部换到男生前面的时间. 思路: 解法一:队伍最前面的那些女生不需要交换,后面的女生有两种状态:畅通无阻,前一个女生 ...
- hdu 4291 A Short problem
数学题,找循环节!! 首先g(g(g(n)))=g(x) mod 1e9+7 则可知x有循环节1e9+7; 之后x=g(g(n)),则可算出g(n)的循环节,在算出n的循环节就可以了!! 代码如下: ...
- UVALive - 6577 Binary Tree 递推+找规律
题目链接: http://acm.hust.edu.cn/vjudge/problem/48421 Binary Tree Time Limit: 3000MS 问题描述 Binary Tree is ...
- C. Tennis Championship dp递推 || 找规律
http://codeforces.com/contest/735/problem/C C. Tennis Championship time limit per test 2 seconds mem ...
随机推荐
- android项目源码
[置顶] Android精品开源项目整理_V20140221(持续更新中..) 让我们回顾下2013年有哪些精品资源:Android精品开源项目整理_V20131115(持续更新中..) 引言: ...
- PICO 中关于时基ps3000aGetTimebase函数介绍
- Java编程环境eclipse配置
一. 下载并安装JDK https://www.cnblogs.com/zhangchao0515/p/6806408.html 二.下载并解压Eclipse https://www.cnblogs. ...
- Eclipse中导入Hadoop源代码工程
以hadoop 2.7.3为例, jdk1.7.0_80 , Eclipse Mars(4.5), Apache Maven 3.0.5 mvn时需要使用root权限,即县切换到root用户,用命 ...
- 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 ...
- 2.12 Hivet中order by,sort by、distribute by和cluster by
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+SortBy 一.order by 对全局数据的排序,仅仅只有一个red ...
- LeetCode: 258 Add Digits(easy)
题目: Given a non-negative integer num, repeatedly add all its digits until the result has only one di ...
- 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 ...
- 洛谷 - P3935 - Calculating - 整除分块
https://www.luogu.org/fe/problem/P3935 求: \(F(n)=\sum\limits_{i=1}^{n}d(i)\) 枚举因子\(d\),每个因子\(d\)都给其倍 ...
- Two sum(给定一个无重复数组和目标值,查找数组中和为目标值的两个数,并输出其下标)
示例: nums = [1,2,5,7] target = [6] return [0,2] Python解决方案1: def twoSum(nums, target): ""&q ...