2017 Multi-University Training Contest 10 1002 Array Challenge HDU 6172(找规律 矩阵快速幂)
来源:互联网 发布:淘宝免费店招图片 编辑:程序博客网 时间:2024/06/04 19:35
题意:There’s an array that is generated by following rule.
h0=2,h1=3,h2=6,hn=4hn−1+17hn−2−12hn−3−16
And let us define two arraysbnandan as below.
bn=3hn+1hn+9hn+1hn−1+9h2n+27hnhn−1−18hn+1−126hn−81hn−1+192(n>0)
an=bn+4n
Now, you have to print⌊√(an)⌋ , n>1.
And let us define two arrays
Now, you have to print
Your answer could be very large so print the answer modular 1000000007.
思路:这规律都能找到。。。也是厉害的。。。
摘自博客:点击打开链接
解题思路:设
又
可以发现
于是根据
是一个线性递推式,用矩阵快速幂。
代码:
#include<iostream>#include<cstdio>#include<cstring>using namespace std;typedef long long ll;const int mod = 1e9+7;struct node{ ll s[5][5];};node mul(node a, node b){ node t; memset(t.s, 0, sizeof(t.s)); for(int i = 1; i <= 3; i++) for(int j = 1; j <= 3; j++) for(int k = 1; k <= 3; k++) t.s[i][j] = (t.s[i][j]+a.s[i][k]*b.s[k][j]+mod)%mod; return t;}node mt_pow(node p, ll q){ node res; memset(res.s, 0, sizeof(res.s)); for(int i = 1; i <= 3; i++) res.s[i][i] = 1; while(q) { if(q%2) res = mul(res, p); p = mul(p, p); q /= 2; } return res;}int main(void){ int t; cin >> t; while(t--) { ll n; scanf("%lld", &n); if(n == 2) puts("31"); else if(n == 3) puts("197"); else if(n == 4) puts("1255"); else if(n == 5) puts("7997"); else { node base; memset(base.s, 0, sizeof(base.s)); base.s[1][1] = 4, base.s[1][2] = 17, base.s[1][3] = -12; base.s[2][1] = 1, base.s[3][2] = 1; node ans = mt_pow(base, n-4); ll res = (ans.s[1][1]*1255%mod+ans.s[1][2]*197%mod+ans.s[1][3]*31%mod+mod)%mod; printf("%lld\n", res); } } return 0;}
阅读全文
1 0
- 2017 Multi-University Training Contest 10 1002 Array Challenge HDU 6172(找规律 矩阵快速幂)
- HDU 6172 Array Challenge(打表+矩阵快速幂)——2017 Multi-University Training Contest
- hdu 6038 找规律 置换 2017 Multi-University Training Contest
- HDU 6172 Array Challenge 找规律+矩阵快速幂
- Hdu 3936 FIB Query[矩阵快速幂](2011 Multi-University Training Contest 10 - Host by HRBEU)
- HDU 6038 Function(找规律)——2017 Multi-University Training Contest
- HDU 6048 Puzzle(找规律)——2017 Multi-University Training Contest
- HDU 5754 Life Winner Bo(找规律 + 威佐夫博弈)--2016 Multi-University Training Contest 3
- HDU 5826 physics(积分 找规律)——2016 Multi-University Training Contest 8
- HDU 5399 Too Simple(数学 + 找规律)——2015 Multi-University Training Contest 9
- 2017 Multi-University Training Contest 7:Hard challenge
- HDU 6127 Hard challenge(思维+计算几何)——2017 Multi-University Training Contest
- HDU 3068 2017 Multi-University Training Contest
- HDU 6034 & 2017 Multi-University Training Contest
- hdu 6034 2017 Multi-University Training Contest
- HDU 3065 2017 Multi-University Training Contest
- HDU 6047 2017 Multi-University Training Contest
- HDU 6052 2017 Multi-University Training Contest
- 与''高内聚,低耦合"的交流
- Java面试题总结
- MATLAB实现 ICA 鸡尾酒会语音分离
- hdu6172(Array Challenge)-Berlekamp-Massey算法
- 机器学习中的数学(3)-模型组合(Model Combining)之Boosting与Gradient Boosting
- 2017 Multi-University Training Contest 10 1002 Array Challenge HDU 6172(找规律 矩阵快速幂)
- Lyft 计划开源人工智能算法测试工具
- 面向过程、面向对象与面向切面的分析!!
- 基于hadoop搜索引擎实践——总体概述(一)
- 初入python思维导图
- HDU 1401 Solitaire [双向BFS]
- 2017 Multi-University Training Contest 10 1008 Monkeys&& HDU 6178 (贪心+超级读入挂fread)
- Session会话与cookie
- 数组单调和