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

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

真的很感人啊

这是洛谷11月月赛的T1

因为我睡晚了,没打……

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

思路

一开始想找数学方法过

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

 

思路就是用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;
        }
    }
}

 

相关文章: