题目链接

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 &amp;= (N-1 + 1) ^ 3\\ &amp;=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 &amp; 1 &amp; 0 &amp; 0 &amp; 0 &amp; 0 \\ 2 &amp; 1 &amp; C_3^0 &amp;C_3^1 &amp;C_3^2&amp;C_3^3 \\ 0 &amp; 0 &amp; C_3^0 &amp;C_3^1 &amp;C_3^2&amp;C_3^3\\ 0 &amp; 0 &amp; 0 &amp;C_2^0 &amp;C_2^1&amp;C_2^2\\ 0 &amp; 0 &amp;0 &amp;0 &amp;C_1^0&amp;C_1^1\\ 0 &amp; 0 &amp; 0 &amp;0 &amp;0&amp;C_3^3\\ \end{matrix} \right\} ⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧​020000​110000​0C30​C30​000​0C31​C31​C20​00​0C32​C32​C21​C10​0​0C33​C33​C22​C11​C33​​⎭⎪⎪⎪⎪⎪⎪⎬⎪⎪⎪⎪⎪⎪⎫​
这时状态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 (构造矩阵+矩阵快速幂)相关推荐

  1. HDU 4565So Easy!2012长沙邀请赛A题(共轭构造+矩阵的快速幂)

    So Easy! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total S ...

  2. 求解斐波那契第n项的几种解法(含矩阵乘法+快速幂) Python实现

    斐波那契数列 首先我们来定义一下斐波那契数列: f(n)={0n = 01n = 1f(n−1)+f(n−2)n > 1f(n)= \begin{cases} 0 & \text {n ...

  3. bzoj 4417: [Shoi2013]超级跳马(矩阵合并+快速幂)

    4417: [Shoi2013]超级跳马 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 410  Solved: 252 [Submit][Stat ...

  4. 【BZOJ 2323】 2323: [ZJOI2011]细胞 (DP+矩阵乘法+快速幂*)

    2323: [ZJOI2011]细胞 Description 2222年,人类在银河系外的某颗星球上发现了生命,并且携带了一个细胞回到了地球.经过反复研究,人类已经完全掌握了这类细胞的发展规律: 这种 ...

  5. [矩阵乘法/快速幂专题]Arc of Dream,Recursive sequence,233 Matrix,Training little cats

    矩阵快速幂习题 复习矩阵乘法及快速幂模板 乘法模板 快速幂模板 T1:Arc of Dream 题目 题解 code T2:Recursive sequence 题目 题解 code T3:233 M ...

  6. 循环矩阵的快速幂(bzoj 2510: 弱题)

    2510: 弱题 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 408  Solved: 218 [Submit][Status][Discuss] ...

  7. [BZOJ3240][Noi2013]矩阵游戏 快速幂

    当我知道这题矩阵可以用费马小定理搞快速幂的时候 我眼泪都要落下来了QAQ 首先求一发通项F[1][1]->F[2][1]的通项 然后写成A+B的形式 若a != 1 A = (a^(m-1))* ...

  8. ZCMU-1618-骨牌覆盖(矩阵乘法+快速幂)

    1618: 骨牌覆盖1 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 264  Solved: 124 [Submit][Status][Web Bo ...

  9. Xn数列(矩阵乘法+快速幂+慢速乘法)

    Xn数列 题目描述: 给你6个数,m, a, c, x0, n, g Xn+1 = ( aXn + c ) mod m,求Xn m, a, c, x0, n, g<=10^18 输入描述: 一行 ...

  10. 根据递推公式构造系数矩阵用于快速幂

    简单的例子 Fibonacci数列 考虑 Fibonacci Fibonacci数列, F(n)=F(n−1)+F(n−2) F(n)=F(n-1)+F(n-2) 将右边两项看做是一个列向量的形式,令 ...

最新文章

  1. vs2015网站发布时,设置页面合并后程序集的文件版本
  2. vue2.0关于添加属性后视图不能更新的问题
  3. 数论六之计算几何干货——计算几何模板解释全集 及 模板检验训练场
  4. 【计蒜客 - 2019南昌邀请赛网络赛 - H】Coloring Game(找规律,思维dp)
  5. php程序如何加密(php_screw)
  6. python复杂代码示例_6 个例子教你重构 Python 代码
  7. 计蒜客:区间整数操作-区间更新-区间和
  8. RealSense D435i数据录制 VINS离线运行
  9. SSRF深度解析Gopher协议
  10. 桶装水同城预订下单送水小程序开发制作(水站桶装水配送系统)
  11. 共建WEB3.0基础设施 NodeSea推出分布式域名后缀 .fil .bzz .xch .iot
  12. Python语法基础14 pickle与json模块 异常处理
  13. 天下数据解析域名及域名转向
  14. Behavior Designer 中文版教程
  15. 谷歌开源芯片 180 纳米制造工艺
  16. 【转】slideUp() 和slideDown() 如何解决反复抖动的问题
  17. Base64使用案例
  18. SIM卡的密码PIN与PUK密码PIN
  19. readmemh函数引用的txt格式_[转载](zz)用于读取和写入文本文件Verilog代码
  20. VMware 安装 SOFTICE 问题

热门文章

  1. 【UOJ】67 新年的毒瘤 【BZOJ】1123 BLO
  2. SVN报错working copy is not uptodate
  3. usbserials
  4. Struts2拦截器之FileUploadInterceptor
  5. 介绍几款好用的Web开发管理工具
  6. 查询优化器内核剖析第一篇
  7. 在Activity的Title中加入进度条
  8. 此时无法停用连接。这个连接可能在用一个或多个不支持即插即用的协议,或者它是由其他用户或系统帐户初始化的。...
  9. MVC架构在Asp.net中的应用和实现
  10. 提升 .NET 程序性能的 一些 原则