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

这是一道恶心的数学题,令人谔谔!


大家都看过题面了吧?我现在来说说我的思路。

首先我在这篇博客中提出了 S n − 2 + 1 = F n S_{n-2}+1=F_n Sn2+1=Fn S n = F n + 2 − 1 S_n=F_{n+2}-1 Sn=Fn+21

然后看题目给出的柿子。把他变成一个三角形:

F 1 F_1 F1
F 2    F 2 F_2 \ \ F_2 F2  F2
F 3    F 3    F 3 F_3 \ \ F_3 \ \ F_3 F3  F3  F3
F 4    F 4    F 4    F 4 F_4 \ \ F_4 \ \ F_4 \ \ F_4 F4  F4  F4  F4
F 5    F 5    F 5    F 5    F 5 F_5 \ \ F_5 \ \ F_5 \ \ F_5 \ \ F_5 F5  F5  F5  F5  F5
… … … … \texttt{…………}

答案就是这个三角形内所有数之和。

我们可以把这个三角形竖着看,发现了啥?这个式子就是:

∑ i = 1 n ( S n − S i − 1 ) \sum \limits_{i=1}^n (S_n-S_{i-1}) i=1n(SnSi1)

S n S_n Sn 提取出来:

n S n − ∑ i = 1 n S i − 1 nS_n-\sum\limits_{i=1}^nS_{i-1} nSni=1nSi1

这个时候, S n = F n + 2 − 1 S_n=F_{n+2}-1 Sn=Fn+21 派上用场了。把这个柿子往里面套啊!

n ( F n + 2 − 1 ) − ∑ i = 1 n ( F i + 1 − 1 ) n(F_{n+2}-1) - \sum\limits_{i=1}^n (F_{i+1}-1) n(Fn+21)i=1n(Fi+11)

发现了啥? ∑ i = 1 n ( F i + 1 − 1 ) \sum\limits_{i=1}^n (F_{i+1}-1) i=1n(Fi+11) 其实也可以转化为 S n + 1 − F 1 − n S_{n+1}-F_1-n Sn+1F1n

S n = F n + 2 − 1 S_n=F_{n+2}-1 Sn=Fn+21 再往 S n + 1 S_{n+1} Sn+1 里面套!

答案就变成了:

     n ( F n + 2 − 1 ) − ( F n + 3 − 1 − F 1 − n ) \ \ \ \ n(F_{n+2}-1)- (F_{n+3}-1-F_1-n)     n(Fn+21)(Fn+31F1n)
= n F n + 2 − n − F n + 3 + 1 + F 1 + n =nF_{n+2}-n-F_{n+3}+1+F_1+n =nFn+2nFn+3+1+F1+n
= n F n + 2 − F n + 3 + 2 =nF_{n+2}-F_{n+3}+2 =nFn+2Fn+3+2

一个矩阵加速就搞定了。

恶心至极啊!

code: \text{code:} code:

#include<cstdio>
using namespace std;
long long n,m;
struct mat{
    long long a[5][5];
};
inline void clear(mat &z)
{
	for(int i=1;i<=2;i++)
	    for(int j=1;j<=2;j++) z.a[i][j]=0;
}
inline mat operator* (mat A,mat B)
{
	mat c;clear(c);
	for(int i=1;i<=2;i++)
	    for(int j=1;j<=2;j++)
	        for(int k=1;k<=2;k++)
	        c.a[i][j]=(c.a[i][j]+A.a[i][k]*B.a[k][j])%m;
	return c;
}
inline mat operator^ (mat A,long long b)
{
	mat c;clear(c);
	c.a[1][1]=c.a[1][2]=1;
	mat base=A;
	while(b)
	{
		if(b&1) c=c*base;
		base=base*base;
		b/=2;
	}
	return c;
}
int main()
{
	scanf("%lld%lld",&n,&m);
	if(n==1) {printf("%lld\n",1%m);return 0;}
	mat first;clear(first);
	first.a[1][1]=first.a[1][2]=first.a[2][1]=1;
	long long tmp1=n*((first^(n)).a[1][1])%m;
	long long tmp2=((first^(n+1)).a[1][1])%m;
	printf("%lld\n",(tmp1-tmp2+2+m)%m);
	return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
《计算机操作系统(第4版)》学习指导与题解 含实验.pdf是一本关于计算机操作系统的学习指导和题解的电子书。这本书主要针对操作系统这个重要的计算机课程内容进行了详细的解释和讲解,对读者学习操作系统具有很大的帮助。 这本电子书的特点是结合了学习指导和题解,旨在帮助读者更好地理解和掌握操作系统的知识。书中过讲解操作系统的基本概念、原理和技术,引导读者深入理解操作系统的工作原理和实现方法。同时,书中还提供了一些习题和实验,帮助读者巩固所学的知识,提升操作系统的实践能力。 这本电子书的内容丰富全面,涵盖了操作系统的各个方面。包括进程管理、内存管理、文件系统、输入输出管理等内容。每个章节都有详细的解释和示,配有相关的习题和实验,可以帮助读者更好地理解和运用所学的知识。 对于计算机专业的学生和从事计算机相关工作的技术人员来说,这本电子书是一本很好的学习资料。过学习这本书,读者可以全面了解和掌握操作系统的知识,提高自己的技能水平。同时,这本电子书还适合作为操作系统相关课程的参考教材,帮助教师更好地教授操作系统的知识。 总之,《计算机操作系统(第4版)》学习指导与题解 含实验.pdf 是一本内容丰富、有助于学习操作系统的电子书,对于学习操作系统或从事计算机相关工作的人士来说都是一本很有价值的学习资料。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值