1. 程式人生 > >[P4994]終於結束的起點 (遞推)

[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; } } }