题目链接

题目

题目描述

qn是个特别可爱的小哥哥,qy是个特别好的小姐姐,他们两个是一对好朋友 [ cp (划掉~)

又是一年嘤花烂漫时,小qn于是就邀请了qy去嘤花盛开的地方去玩。当qy和qn来到了田野里时,qy惊奇的发现,嘤花花瓣以肉眼可见的速度从树上长了出来。

仔细看看的话,花瓣实际上是以一定规律长出来的,而且,每次张成新的花瓣的时候,上一次的花瓣就会都落到地上,而且不会消失。

花瓣生长的规律是,当次数大于等于2时,第i次长出来的花瓣个数和上一次张出来的花瓣个数的差是斐波那契数列的第i-1项。初始的时候地上没有花瓣,树上的花瓣个数为1,第一次生长的花瓣个数为1。初始的那个花瓣就落到了地上

现在,小qn想知道,经过k次生长之后,树上和地上的总花瓣个数是多少?

ps:斐波那契数列:

​ f[1]=f[2]=1;f[i]=f[i-1]+f[i-2] (i>=2且i ∈ N+)

输入描述

一行一个数k

输出描述

一行一个数m,表示第k次生长过后,树上和地上的总花瓣数是多少。由于答案会很大,请你将答案mod 998244353后输出

示例1

输入

4

输出

12

说明

第一次:树上1,地上1.第二次树上2,地上1+1,第三次树上3,地上1+1+2,第四次树上5,地上1+1+2+3。总共12个

示例2

输入

5

输出

20

说明

第五次树上8,地上1+1+2+3+5。总共20个

备注

对于0%的数据,有k=样例

对于20%的数据,有k<=1'000

对于60%的数据,有k<=1'000'000

对于80%的数据,有k<=1'000'000'000

对于100%的数据,有k<1'000'000'000'000'000'000

题解

知识点:运算优化,线性代数。

设 \(f(i)\) 表示第 \(i\) 次长出来的花瓣数,\(g(i)\) 表示第 \(i\) 次生长后花瓣总数, \(F(i)\) 表示斐波那契数列第 \(i\) 项。

显然,有如下转移:

\[\begin{aligned}
\begin{pmatrix}
1 &1 &0 &0\\
0 &1 &1 &0\\
0 &0 &1 &1\\
0 &0 &1 &0\\
\end{pmatrix}
\begin{pmatrix}
g(i)\\
f(i+1)\\
F(i+1)\\
F(i)\\
\end{pmatrix}
=
\begin{pmatrix}
g(i+1)\\
f(i+2)\\
F(i+2)\\
F(i+1)\\
\end{pmatrix}
\end{aligned}
\]

我们使用矩阵快速幂优化,有如下等式:

\[\begin{aligned}
\begin{pmatrix}
1 &1 &0 &0\\
0 &1 &1 &0\\
0 &0 &1 &1\\
0 &0 &1 &0\\
\end{pmatrix}^k
\begin{pmatrix}
g(0)\\
f(1)\\
F(1)\\
F(0)\\
\end{pmatrix}
=
\begin{pmatrix}
g(k)\\
f(k+1)\\
F(k+1)\\
F(k)\\
\end{pmatrix}
\end{aligned}
\]

时间复杂度 \(O(\log k)\)

空间复杂度 \(O(1)\)

代码

#include <bits/stdc++.h>
using namespace std;
using ll = long long; struct Matrix {
const static int P; int n, m;
vector<vector<int>> mat; Matrix(int _n = 0) :n(_n), m(_n), mat(_n + 1, vector<int>(_n + 1)) { for (int i = 1;i <= n;i++) mat[i][i] = 1; }
Matrix(int _n, int _m) :n(_n), m(_m), mat(_n + 1, vector<int>(_m + 1)) {}
Matrix(const vector<vector<int>> &_mat) :n(_mat.size() - 1), m(_mat[1].size() - 1), mat(_mat) {} friend Matrix operator*(const Matrix &A, const Matrix &B) {
Matrix ans(A.n, B.m);
if (A.m != B.n) return ans;
for (int i = 1;i <= A.n;i++)
for (int k = 1;k <= A.m;k++) //a.m == b.n
for (int j = 1;j <= B.m;j++)
ans.mat[i][j] = (ans.mat[i][j] + 1LL * A.mat[i][k] * B.mat[k][j]) % P;
return ans;
} friend Matrix operator^(Matrix A, ll k) {
Matrix ans(A.n);
while (k) {
if (k & 1) ans = ans * A;
k >>= 1;
A = A * A;
}
return ans;
} friend ostream &operator<<(ostream &os, const Matrix &A) {
for (int i = 1; i <= A.n; i++)
for (int j = 1; j <= A.m; j++)
os << A.mat[i][j] << " \n"[i != A.n && j == A.m];
return os;
}
}; const int P = 998244353;
const int Matrix::P = ::P; Matrix A(
{
{-1,-1,-1,-1,-1},
{-1, 1, 1, 0, 0},
{-1, 0, 1, 1, 0},
{-1, 0, 0, 1, 1},
{-1, 0, 0, 1, 0}
}
); Matrix B(
{
{-1,-1},
{-1, 1},
{-1, 1},
{-1, 1},
{-1, 0},
}
); int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
ll n;
cin >> n;
cout << ((A ^ n) * B).mat[1][1] << '\n';
return 0;
}

NC18987 粉嘤花之恋的更多相关文章

  1. 牛客OI赛制测试赛3 解题报告

    前话: 话说考试描述:普及难度. 于是想在这场比赛上涨点信心. 考出来的结果:Point:480     Rank:40 然而同机房的最好成绩是 510. 没考好啊!有点炸心态,D题一些细节没有注意, ...

  2. ISCTF 2022

    Re SigninReverse ida 64 位 打开程序,即可获得flag ISCTF{27413241-9eab-41e2-aca1-88fe8b525956} ezbase # coding= ...

  3. TSCTF-J 2022 WP

    Re baby_xor 加密逻辑如上,密文动态调试,然后 Shift+E 导出密文[这样避免了手动获取] # encoding=utf-8 enc=[ 0x12, 0x00, 0x00, 0x00, ...

  4. NewStarCTF 公开赛 2022 RE WP

    Week 2 Re 前可见古人,后得见来者 chipher = [0x51, 0x5B, 0x4C, 0x56, 0x59, 0x4D, 0x50, 0x56, 0x54, 0x43, 0x7D, 0 ...

  5. Wave - 花たん 音乐

    Wave 歌手:花たん 所属专辑:Flower 間違えて宇宙終わって(宇宙因为一个错误而终结了) 青信号はいつも通り(通行的灯号一如往常的) 飛んでまた止まって(又再停止传播) また 飛びそうだ(然后 ...

  6. Java之恋

    初次见面那是一个河北的夏天风随沙散落天涯蝴蝶依旧恋着花回首走过的日子手指和键盘之间的梦想之光已恍如昨日 那年我还是一个刚踏进这个曾经只在地理课本上狂念南稻北麦,南油北花的土地那年你只是我必须要学的编程 ...

  7. 盛世狂欢意犹未尽之恋舞OL折扣平台多角度体验

    2018国民级时尚音乐舞蹈手游<恋舞OL>,女生都爱玩的手机游戏.画风Q萌的3D音乐舞蹈手游,多人同时在线,玩法轻松休闲,浪漫场景自由社交互动,恋上指尖舞蹈. 小编看了上述介绍之后,感觉已 ...

  8. 罗辑思维CEO脱不花:关于工作和成长,这是我的121条具体建议

    1 关于面对批评 01. 没有人对被批评感到高兴.如果有,TA撒谎. 02. 面对批评,得体的第一反应是“不急于解释,不反唇相讥”. 03. 每天,或者最长每周养成习惯,把自己存在的问题和造成的麻烦用 ...

  9. gitbook 入门教程之还在搞公众号互推涨粉?gitbook 集成导流工具,轻轻松松躺增粉丝!

    相信大多数博客作者都或多或少有过这样想法: 现在各种平台这么多,想要实现全平台发布就要到处复制粘贴,等我有空一定做统一平台一次性全部解决! 不知道正在阅读文章的你,有没有这样的想法? 反正我确实这么想 ...

  10. EZchip花1.3亿美元买Tilera然后以8亿美元把自己与Tilera一起卖掉

    2014年7月EZchip花1.3亿美元收购的Tilera2015年10 Mellanox 8亿美元收购EZchip,2016年1月完成.EZchip转手卖掉Tilera与自己? http://www ...

随机推荐

  1. 超全面总结Vue面试知识点,助力金三银四

    前言 本文会对Vue中一些常见的重要知识点以及框架原理进行整理汇总,意在帮助作者以及读者自测Vue的熟练度以及方便查询与复习.金三银四的到来,想必vue会是很多面试官的重点考核内容,希望小伙伴们读完本 ...

  2. JS - Array - 在数组的指定下标添加或替换元素 。 也可删除指定下标的元素

    一,首先介绍下 js Array对象 中的 splice 方法 . ( splice在英文中是剪接的意思 ) 1,定义和用法 splice() 方法用于插入.删除或替换数组的元素. 注意:这种方法会改 ...

  3. JMS微服务开发示例(六)安全退出进程

    默认情况下,如果在linux,需要关闭微服务进程,请务必使用 kill -15 进程id 命令,其他命令可能会直接关闭进程,造成数据丢失. 例如,有个后台任务,执行了一半,这时候进程突然关闭了,会形成 ...

  4. [转帖]Kibana查询语言(KQL)

    时间  2020-12-27 标签 html java 数据库 ide ui 翻译 日志 htm 对象 blog 栏目 HTML 繁體版 原文   https://www.cnblogs.com/-b ...

  5. CentOS7升级Glibc到超过2.17版本无法启动的解决办法

    CentOS7升级Glibc到超过2.17版本无法启动的解决办法 背景 今天有同事告知服务器宕机无法启动. 提示信息为: [sda] Assuming drive cache: write throu ...

  6. linux 53端口占用的原因

    解析 Linux 下 53 端口占用的现象 在 Linux 系统中,端口 53 往往是与域名解析服务(DNS)相关的.本文将详细介绍一个与端口 53 相关的情景,以及如何使用命令行工具来解析和理解这一 ...

  7. 高性能MySQL实战(三):性能优化 | 京东物流技术团队

    这篇主要介绍对慢 SQL 优化的一些手段,而在讲解具体的优化措施之前,我想先对 EXPLAIN 进行介绍,它是我们在分析查询时必要的操作,理解了它输出结果的内容更有利于我们优化 SQL.为了方便大家的 ...

  8. Ant Design Vue 单文件上传Upload

    单文件上传 <a-upload name="file" :beforeUpload="beforeUpload" :multiple="fals ...

  9. 【发现一个问题】VictoriaMetrics中,突然某个时间段新增的data point无法查询出来

    写了一个很简单的python程序,使用remote write协议发数据到vm-insert. 可是有个时段突然查询不出来数据了. 百思不得其解. 吃完中午饭,刷新页面又出来了. 还不清楚问题出现在哪 ...

  10. 爬虫逆向基础,认识 SM1-SM9、ZUC 国密算法

    关注微信公众号:K哥爬虫,QQ交流群:808574309,持续分享爬虫进阶.JS/安卓逆向等技术干货! [01x00] 简介 国密即国家密码局认定的国产加密算法,爬虫工程师在做 JS 逆向的时候,会遇 ...