HDU-4291 A Short problem(矩阵快速幂)
来源:互联网 发布:opengl游戏编程 pdf 编辑:程序博客网 时间:2024/05/21 06:52
A Short problem
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2749 Accepted Submission(s): 966
Problem Description
According to a research, VIM users tend to have shorter fingers, compared with Emacs users.
Hence they prefer problems short, too. Here is a short one:
Given n (1 <= n <= 1018), You should solve for
g(g(g(n))) mod 109 + 7
where
g(n) = 3g(n - 1) + g(n - 2)
g(1) = 1
g(0) = 0
Hence they prefer problems short, too. Here is a short one:
Given n (1 <= n <= 1018), You should solve for
where
Input
There are several test cases. For each test case there is an integer n in a single line.
Please process until EOF (End Of File).
Please process until EOF (End Of File).
Output
For each test case, please print a single line with a integer, the corresponding answer to this case.
Sample Input
012
Sample Output
0142837
题解:矩阵快速幂
由于g(n)是嵌套形成g(g(g(n)))的,只有最外层才mod 1e9+7,因此不能每一层都mod 1e9+7我们可以先找到最外层在mod 1e9+7下的循环节p,然后再找第二层在mod p下的循环节p1
这样答案就等于g(g(g(n)%p1)%p)%mod
#include<cstdio>#include<algorithm>#include<string.h>#include<map>using namespace std;typedef long long LL;struct Mat{ LL x[2][2],sz; LL mod; Mat(){ memset(x,0,sizeof(x)); sz=2; } void init(){ for(int i=0;i<sz;i++) x[i][i]=1; } Mat operator*(const Mat& m)const{ Mat ret; ret.mod=mod; for(int i=0;i<sz;i++) for(int j=0;j<sz;j++) for(int k=0;k<sz;k++) ret.x[i][j]=(ret.x[i][j]+x[i][k]*m.x[k][j])%mod; return ret; } void print(){ for(int i=0;i<sz;i++) for(int j=0;j<sz;j++) printf("%d%c",x[i][j],j==sz-1?'\n':' '); }};Mat pow(Mat A,LL k,LL mod){ Mat ret; ret.init(); ret.mod=A.mod=mod; //printf("[%lld]\n",mod); while(k){ if(k&1) ret=ret*A; A=A*A; k>>=1; } return ret;}LL get_ans(LL k,LL p){ if(k<=0) return 0; Mat A; A.x[0][0]=3;A.x[0][1]=1; A.x[1][0]=1; return pow(A,k-1,p).x[0][0];}const LL mod1 = 1e9 + 7;const LL mod2=222222224;const LL mod3=183120;LL solve(LL k){ k=get_ans(k,mod3); k=get_ans(k,mod2); return get_ans(k,mod1);}int main(){ LL n; //freopen("in.txt","r",stdin); while(~scanf("%lld",&n)){ printf("%lld\n",solve(n)); } return 0;}
阅读全文
0 0
- HDU-4291 A Short problem(矩阵快速幂)
- hdu 4291 A Short problem(矩阵快速幂)
- 【HDU】4291 A Short problem 矩阵快速幂
- hdu 4291 A Short problem 打表找规律&矩阵快速幂
- HDU 4291 A Short problem(矩阵快速幂+循环节)
- HDU 4291 A Short problem // 矩阵快速幂, 循环节
- hdu 4291 A Short problem(矩阵快速幂)
- HDU 4291-A Short problem-循环节+矩阵快速幂
- HDU 4291 A Short problem (2012成都网络赛,矩阵快速幂+循环节)
- HDU 4291 A Short problem(矩阵快速幂+循环节)
- HDU——4291A Short problem(矩阵快速幂+循环节)
- HDU 4291 A Short problem(矩阵快速幂取模求循环节)
- hdu 4291 A Short problem 矩阵快速幂,找循环节
- hdu 4291 A Short problem 矩阵+循环
- 矩阵相乘,快速算法 HDOJ 4291 A Short problem
- hdoj 4291 A Short problem 【找循环节 + 矩阵快速幂】
- Hdoj.4291 A Short problem【矩阵快速幂+循环节处理】 2015/12/09
- 【求循环节+矩阵快速幂】HDOJ A Short problem 4291
- EventBus 源码试读(一)
- Scala控制结构
- 文章标题
- 判断某一年是否是闰年
- linux device tree 详解
- HDU-4291 A Short problem(矩阵快速幂)
- 虚拟机的桥接模式,NAT,仅主机三种网络模式
- Hacker(一)
- spring单例模式与线程安全问题的解决方案
- LightOJ 1422 Halloween Costumes
- Django 的request 和 response对象
- 1:总结并剖析malloc/free和new/delete之间关系和差异。 2:剖析new/delete、new[]/delete[]到底做了些什么事情。 3:实现NEW_ARRAY/DE
- EventBus 源码试读(二)
- Linux笔记 ——KDE &GNOME安装分区与文件类型