HDU-6470 Count (构造矩阵+矩阵快速幂)
题目链接
Problem Description
Farmer John有n头奶牛.
某天奶牛想要数一数有多少头奶牛,以一种特殊的方式:
第一头奶牛为1号,第二头奶牛为2号,第三头奶牛之后,假如当前奶牛是第n头,那么他的编号就是2倍的第n-2头奶牛的编号加上第n-1头奶牛的编号再加上自己当前的n的三次方为自己的编号.
现在Farmer John想知道,第n头奶牛的编号是多少,估计答案会很大,你只要输出答案对于123456789取模.
Input
第一行输入一个T,表示有T组样例
接下来T行,每行有一个正整数n,表示有n头奶牛 (n>=3)
其中,T=104,n<=1018
Output
共T行,每行一个正整数表示所求的答案
Sample Input
5
3
6
9
12
15
Sample Output
31
700
7486
64651
527023
思路
求解过程类似于斐波那契数列,这里的N太大,需要用快速幂的log(N)log(N)log(N)来优化。
首先递推公式:F(N)=2∗F(N−2)+F(N−1)+N3F(N) = 2*F(N-2) + F(N-1) + N^3F(N)=2∗F(N−2)+F(N−1)+N3
下面构造矩阵来优化:
N3=(N−1+1)3=C30(N−1)3+C31(N−1)2+C32(N−1)1+C33(N−1)0\begin{aligned} N^3 &= (N-1 + 1) ^ 3\\ &=C_3^0(N-1)^3 + C_3^1(N-1)^2 +C_3^2(N-1)^1 +C_3^3(N-1)^0\\ \end{aligned} N3=(N−1+1)3=C30(N−1)3+C31(N−1)2+C32(N−1)1+C33(N−1)0
假设我们已知:{F(N−2)F(N−1)(N−1)3(N−1)2(N−1)1(N−1)0}1需要求:{F(N−1)F(N)N3N2N1N0}2假设我们已知:\left\{ \begin{aligned} F(N-2)\\ F(N-1)\\ (N-1)^3\\ (N-1)^2\\ (N-1)^1\\ (N-1)^0\\ \end{aligned} \right\}_1 需要求:\left\{ \begin{aligned} F(N-1)\\ F(N)\\ N^3\\ N^2\\ N^1\\ N^0\\ \end{aligned} \right\}_2 假设我们已知:⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧F(N−2)F(N−1)(N−1)3(N−1)2(N−1)1(N−1)0⎭⎪⎪⎪⎪⎪⎪⎪⎪⎪⎬⎪⎪⎪⎪⎪⎪⎪⎪⎪⎫1需要求:⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧F(N−1)F(N)N3N2N1N0⎭⎪⎪⎪⎪⎪⎪⎪⎪⎪⎬⎪⎪⎪⎪⎪⎪⎪⎪⎪⎫2
这是我们需要一个矩阵
{01000021C30C31C32C3300C30C31C32C33000C20C21C220000C10C1100000C33}\left\{ \begin{matrix} 0 & 1 & 0 & 0 & 0 & 0 \\ 2 & 1 & C_3^0 &C_3^1 &C_3^2&C_3^3 \\ 0 & 0 & C_3^0 &C_3^1 &C_3^2&C_3^3\\ 0 & 0 & 0 &C_2^0 &C_2^1&C_2^2\\ 0 & 0 &0 &0 &C_1^0&C_1^1\\ 0 & 0 & 0 &0 &0&C_3^3\\ \end{matrix} \right\} ⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧0200001100000C30C300000C31C31C20000C32C32C21C1000C33C33C22C11C33⎭⎪⎪⎪⎪⎪⎪⎬⎪⎪⎪⎪⎪⎪⎫
这时状态111就可以通过矩阵得到状态222
初始矩阵{F(1)F(2)23222120}3初始矩阵\left\{ \begin{aligned} F(1)\\ F(2)\\ 2^3\\ 2^2\\ 2^1\\ 2^0\\ \end{aligned} \right\}_3 初始矩阵⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧F(1)F(2)23222120⎭⎪⎪⎪⎪⎪⎪⎪⎪⎪⎬⎪⎪⎪⎪⎪⎪⎪⎪⎪⎫3
Ans=matrixn−2∗matrix3Ans = matrix^{n-2} * matrix_3Ans=matrixn−2∗matrix3
#include <bits/stdc++.h>
#define LL long long
#define P pair<int, int>
#include <time.h>
#define lowbit(x) (x & -x)
#define mem(a, b) memset(a, b, sizeof(a))
#define rep(i, a, n) for (int i = a; i <= n; ++i)
const int maxn = 1044373;
#define mid ((l + r) >> 1)
#define lc rt<<1
#define rc rt<<1|1
using namespace std;const LL mod = 123456789;// 定义矩阵 重载*
struct ac{LL a[6][6];ac operator * (ac b) {ac t;for (int i = 0; i < 6; ++i) {for (int j = 0; j < 6; ++j) {t.a[i][j] = 0;for (int k = 0; k < 6; ++k) {t.a[i][j] = (t.a[i][j] + (a[i][k] * b.a[k][j] % mod)) % mod;}}}return t;}
}g, m;
// 矩阵快速幂
ac quick(ac tmp, LL x) {ac t;mem(t.a, 0);for (int i = 0; i < 6; ++i) t.a[i][i] = 1;while (x) {if (x & 1) t = t * tmp;tmp = tmp * tmp;x >>= 1; }return t;
}int main() {#ifndef ONLINE_JUDGE// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);
#endifios::sync_with_stdio(false);cin.tie(0); cout.tie(0);int T;scanf("%d", &T);g.a[0][1] = 1;g.a[1][0] = 2;g.a[1][2] = g.a[1][1] = 1;g.a[1][3] = g.a[1][4] = 3;g.a[1][5] = g.a[2][2] = 1;g.a[2][3] = g.a[2][4] = 3;g.a[2][5] = g.a[3][3] = 1;g.a[3][4] = 2;g.a[3][5] = g.a[4][4] = g.a[4][5] = g.a[5][5] = 1;m.a[0][0] = 1;m.a[1][0] = 2;m.a[2][0] = 8;m.a[3][0] = 4;m.a[4][0] = 2;m.a[5][0] = 1;while (T--) {LL n;scanf("%lld", &n);if (n == 1 || n == 2) {printf("1\n");continue;}ac t = quick(g, n-2);ac ans = t * m; printf("%lld\n", ans.a[1][0]);}return 0;
}
HDU-6470 Count (构造矩阵+矩阵快速幂)相关推荐
- HDU 4565So Easy!2012长沙邀请赛A题(共轭构造+矩阵的快速幂)
So Easy! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- 求解斐波那契第n项的几种解法(含矩阵乘法+快速幂) Python实现
斐波那契数列 首先我们来定义一下斐波那契数列: f(n)={0n = 01n = 1f(n−1)+f(n−2)n > 1f(n)= \begin{cases} 0 & \text {n ...
- bzoj 4417: [Shoi2013]超级跳马(矩阵合并+快速幂)
4417: [Shoi2013]超级跳马 Time Limit: 10 Sec Memory Limit: 256 MB Submit: 410 Solved: 252 [Submit][Stat ...
- 【BZOJ 2323】 2323: [ZJOI2011]细胞 (DP+矩阵乘法+快速幂*)
2323: [ZJOI2011]细胞 Description 2222年,人类在银河系外的某颗星球上发现了生命,并且携带了一个细胞回到了地球.经过反复研究,人类已经完全掌握了这类细胞的发展规律: 这种 ...
- [矩阵乘法/快速幂专题]Arc of Dream,Recursive sequence,233 Matrix,Training little cats
矩阵快速幂习题 复习矩阵乘法及快速幂模板 乘法模板 快速幂模板 T1:Arc of Dream 题目 题解 code T2:Recursive sequence 题目 题解 code T3:233 M ...
- 循环矩阵的快速幂(bzoj 2510: 弱题)
2510: 弱题 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 408 Solved: 218 [Submit][Status][Discuss] ...
- [BZOJ3240][Noi2013]矩阵游戏 快速幂
当我知道这题矩阵可以用费马小定理搞快速幂的时候 我眼泪都要落下来了QAQ 首先求一发通项F[1][1]->F[2][1]的通项 然后写成A+B的形式 若a != 1 A = (a^(m-1))* ...
- ZCMU-1618-骨牌覆盖(矩阵乘法+快速幂)
1618: 骨牌覆盖1 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 264 Solved: 124 [Submit][Status][Web Bo ...
- Xn数列(矩阵乘法+快速幂+慢速乘法)
Xn数列 题目描述: 给你6个数,m, a, c, x0, n, g Xn+1 = ( aXn + c ) mod m,求Xn m, a, c, x0, n, g<=10^18 输入描述: 一行 ...
- 根据递推公式构造系数矩阵用于快速幂
简单的例子 Fibonacci数列 考虑 Fibonacci Fibonacci数列, F(n)=F(n−1)+F(n−2) F(n)=F(n-1)+F(n-2) 将右边两项看做是一个列向量的形式,令 ...
最新文章
- vs2015网站发布时,设置页面合并后程序集的文件版本
- vue2.0关于添加属性后视图不能更新的问题
- 数论六之计算几何干货——计算几何模板解释全集 及 模板检验训练场
- 【计蒜客 - 2019南昌邀请赛网络赛 - H】Coloring Game(找规律,思维dp)
- php程序如何加密(php_screw)
- python复杂代码示例_6 个例子教你重构 Python 代码
- 计蒜客:区间整数操作-区间更新-区间和
- RealSense D435i数据录制 VINS离线运行
- SSRF深度解析Gopher协议
- 桶装水同城预订下单送水小程序开发制作(水站桶装水配送系统)
- 共建WEB3.0基础设施 NodeSea推出分布式域名后缀 .fil .bzz .xch .iot
- Python语法基础14 pickle与json模块 异常处理
- 天下数据解析域名及域名转向
- Behavior Designer 中文版教程
- 谷歌开源芯片 180 纳米制造工艺
- 【转】slideUp() 和slideDown() 如何解决反复抖动的问题
- Base64使用案例
- SIM卡的密码PIN与PUK密码PIN
- readmemh函数引用的txt格式_[转载](zz)用于读取和写入文本文件Verilog代码
- VMware 安装 SOFTICE 问题