loj #10222. 「一本通 6.5 例 4」佳佳的 Fibonacci 题解

达飞舞被n拿下了

题之跳转

我不会告诉你这是链接

solve

  • 非常神奇的题,huge讲了所以写题解加深记忆
  • Fibonacci都会,Fibonacci的矩阵求法可以看我之前写的板子
  • 考虑一下怎么解决题目要求

观察到\(T(n)\)呈现阶梯式,正难则反,考虑用整体减局部
—— huge

  • 所以我们尝试把\(T(n)\)改变,设总体为S,要减的为G,有
    • \(S_n=\sum\limits_{i=1}^{n}{f_i}\)
    • \(G_n=\sum\limits_{i=1}^{n}{(n-i) \times f_i}=\sum\limits_{i=1}^{n-1}{S_n}\)
  • 直接减,有
    • \(T_n=n \times S_n - G_n\)
  • 表达式有
    • \(f_{n+1}=f_n+f_{n-1}\)
    • \(f_{n}=f_{n-1}+f_{n-2}\)
    • \(S_n=S_{n-1}+f_n\)
    • \(G_n=G_{n-1}+S_{n-1}\)
  • 所以列出矩阵:
    \(\begin{equation} \left[ \begin{array}{c} f_n&f_{n-1}&S_{n-1}&G_{n-1} \end{array} \right ] \times \left[ \begin{array}{cccc} 1&1&1&0\\ 1&0&0&0\\ 0&0&1&1\\ 0&0&0&1 \end{array} \right ] = \left[ \begin{array}{c} f_n+1&f_{n}&S_{n}&G_{n} \end{array} \right ] \end{equation}\)
  • 矩阵ksm搞一下就行了
  • f[]初始化:f[4]={1,0,0,0};
  • 爆炸提示:ksm会搞n,需要再存一下n && 不开long long___

code

#include<bits/stdc++.h>
#define Honkai ios::sync_with_stdio(0);
#define StarRail cin.tie(0);cout.tie(0);
#define endl '\n'
using namespace std;
long long n,m;
long long a[4][4]={{1,1,1,0},{1,0,0,0},{0,0,1,1},{0,0,0,1}};
long long f[4]={1,0,0,0},c[4],c_[4][4];
void multi(long long a[],long long b[][4])
{
	for (long long k=0;k<4;k++) for (long long j=0;j<4;j++) c[j]=(c[j]+(a[k]*b[k][j])%m)%m;
	memcpy(a,c,sizeof(c));memset(c,0,sizeof(c));
}
void multi_self(long long a[][4])
{
	for (long long k=0;k<4;k++) for (long long i=0;i<4;i++) for (long long j=0;j<4;j++) c_[i][j]=(c_[i][j]+(a[i][k]*a[k][j])%m)%m;
	memcpy(a,c_,sizeof(c_));memset(c_,0,sizeof(c_));
}
void ksm() {while (n) {if (n&1) multi(f,a);multi_self(a);n>>=1;}}
int main()
{
	Honkai StarRail
	cin >> n >> m;
	long long N=n;
	ksm();
	long long s=f[2],g=f[3];
	cout << (N*s-g+m)%m << endl;
	return 0;
}
记录

这里不是记录
这里是记录

posted @ 2026-06-16 22:12  msjing  阅读(26)  评论(0)    收藏  举报