【矩阵快速幂 && 循环节】HDU
来源:互联网 发布:ansys软件 编辑:程序博客网 时间:2024/05/18 03:06
Problem Description
Given n (1 <= n <= 10^18), You should solve for
g(g(g(n))) mod 10^9 + 7
where
g(n) = 3g(n - 1) + g(n - 2)g(1) = 1
g(0) = 0
思路:
参考博客:http://blog.csdn.net/a601025382s/article/details/10133651 因为n很大,需要矩阵快速幂。但是要求g(g(n))要求,不能取mod的g(n),所以g(n)特别大。所以得找循环节
#include<cstdio>#include<cstring>using namespace std;struct node{ long long a[3][3];};node c, ans;int Mod[3];//循环节,参考上面链接博客void init()//初始化{ c.a[0][0] = 3; c.a[0][1] = 1; c.a[1][0] = 1; c.a[1][1] = 0; ans.a[0][0] = 1; ans.a[1][0] = 0;}node mul(node x, node y, int mod)//矩阵相乘{ node sum; int i, j, k; for(i = 0; i < 2; i++) { for(j = 0; j < 2; j++) { sum.a[i][j] = 0; for(k = 0; k < 2; k++) { sum.a[i][j] += (x.a[i][k] * y.a[k][j])%mod; sum.a[i][j] %= mod; } } } return sum;}node sm(node t, long long m, int mod)//矩阵快速幂{ node sum; memset(sum.a, 0, sizeof(sum.a)); for(int i = 0; i <= 2; i++) sum.a[i][i] = 1; while(m) { if(m & 1) sum = mul(sum, t, mod); t = mul(t, t, mod); m = m>>1; } return sum;}int main(){ long long n; while(~scanf("%lld", &n)) { init(); Mod[0]=183120; Mod[1]=222222224; Mod[2]=1000000007; node temp; temp.a[0][0] = n; for(int l = 0; l < 3; l++) { if(temp.a[0][0] == 0 || temp.a[0][0] == 1) { break; } temp = sm(c, temp.a[0][0] - 1, Mod[l]); temp = mul(temp, ans, Mod[l]); } printf("%lld\n", temp.a[0][0]); }}
阅读全文
0 0
- hdu 4291 矩阵快速幂+循环节
- HDU 4291 (矩阵快速幂+循环节)
- hdu 4291(矩阵快速幂 + 循环节)
- hdu 5690 矩阵快速幂/循环节
- hdu 4291(矩阵快速幂+循环节)
- 【矩阵快速幂 && 循环节】HDU
- hdu 4291 矩阵的快速幂(寻找循环节)
- HDU 4291 A Short problem(矩阵快速幂+循环节)
- HDU 4291 A Short problem // 矩阵快速幂, 循环节
- hdu 4291 矩阵快速幂+找循环节
- HDU 4291-A Short problem-循环节+矩阵快速幂
- HDU 5895 矩阵快速幂+欧拉降幂公式+指数循环节
- hdu 2276 矩阵快速幂&&循环矩阵优化
- HDU 4291 A Short problem(矩阵快速幂取模求循环节)
- hdu4291 暴力循环节+矩阵快速幂
- [矩阵快速幂+循环节]hdu4291
- HDU 2276 矩阵快速幂,解法:1循环矩阵31ms,2普通矩阵327ms。
- hdu 4291 (循环节+矩阵快速幂,2012成都网络选拔赛1004)
- 面试必懂之数组排序法总结
- 特征分解、奇异值分解、PCA(个人理解)
- Oracle 更改表名称的几种方式
- 组合模式
- Android精确判断是否为64位
- 【矩阵快速幂 && 循环节】HDU
- Git bash中文乱码——say goodbye
- kafka monitor的使用
- 移动端那些事儿(一)移动端开发注意事项
- Java实现CRC16 CCITT
- centos bind dns服务器安装
- 闭包的完美阐述
- Java内存管理和垃圾处理机制
- SpringMVC 和Struts2的区别