终于结束的起点
终于写下句点
终于我们告别
终于我们又回到原点
……一个个 OIer 的竞赛生涯总是从一场 NOIp 开始,大多也在一场 NOIp 中结束,好似一次次轮回在不断上演。
如果这次 NOIp 是你的起点,那么祝你的 OI 生涯如同夏花般绚烂。
如果这次 NOIp 是你的终点,那么祝你的 OI 回忆宛若繁星般璀璨。
也许这是你最后一次在洛谷上打比赛,也许不是。
不过,无论如何,祝你在一周后的比赛里,好运。
真的很感人啊
这是洛谷11月月赛的T1
因为我睡晚了,没打……
思路
一开始想找数学方法过
但是后来看一个大佬的无私分享,想到了滚存
思路就是用f[0],f[1],f[2]只要3给变量就可以进行滚动存储
大家都应该会求斐波那契数列的吧
每一次循环里
f[2] = f[0]; f[0] = f[1]; f[1] = f[2] + f[1];
f[2]是一个用来辅助用的数组
f[0]是上一个数
f[1]是当前数
对于这道题只需要变一下就可以了
f[2] = f[0]; f[0] = f[1]; f[1] = (f[2] + f[1]) % mod;
在循环是时候按照题目判断一下
if (f[0] % mod == 0 && f[1] % mod == 1) { printf("%d", i); return 0; }
就可以了
代码
#include<cstdio> using namespace std; int f[5]; int main() { int mod; scanf("%d", &mod); f[0] = 0; f[1] = 1; f[2] = 1; for(int i=1;i;i++) { f[2] = f[0]; f[0] = f[1]; f[1] = (f[2] + f[1]) % mod; if (f[0] % mod == 0 && f[1] % mod == 1) { printf("%d", i); return 0; } } }