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

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

一个个 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;
        }
    }
}

 

转载于:https://www.cnblogs.com/lincold/p/9903593.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值