[P4994]终于结束的起点 (递推)

时间:2023-03-09 01:25:49
[P4994]终于结束的起点 (递推)

终于结束的起点
终于写下句点
终于我们告别
终于我们又回到原点
……

一个个 OIer 的竞赛生涯总是从一场 NOIp 开始,大多也在一场 NOIp 中结束,好似一次次轮回在不断上演。
如果这次 NOIp 是你的起点,那么祝你的 OI 生涯如同夏花般绚烂。
如果这次 NOIp 是你的终点,那么祝你的 OI 回忆宛若繁星般璀璨。
也许这是你最后一次在洛谷上打比赛,也许不是。
不过,无论如何,祝你在一周后的比赛里,好运。

真的很感人啊

这是洛谷11月月赛的T1

因为我睡晚了,没打……

题目描述

[P4994]终于结束的起点 (递推)

思路

一开始想找数学方法过

但是后来看一个大佬的无私分享,想到了滚存

思路就是用f[0],f[1],f[2]只要3给变量就可以进行滚动存储

大家都应该会求斐波那契数列的吧

每一次循环里
f[] = f[];
f[] = f[];
f[] = f[] + f[];

f[2]是一个用来辅助用的数组

f[0]是上一个数

f[1]是当前数

对于这道题只需要变一下就可以了

f[] = f[];
f[] = f[];
f[] = (f[] + f[]) % mod;

在循环是时候按照题目判断一下

if (f[] % mod ==  && f[] % mod == )
{
printf("%d", i);
return ;
}

就可以了

代码

#include<cstdio>
using namespace std;
int f[];
int main()
{
int mod; scanf("%d", &mod);
f[] = ;
f[] = ;
f[] = ;
for(int i=;i;i++)
{
f[] = f[];
f[] = f[];
f[] = (f[] + f[]) % mod;
if (f[] % mod == && f[] % mod == )
{
printf("%d", i);
return ;
}
}
}