洛谷P4994 终于结束的起点

希望是这道题的第一篇题解,并且真的做到了!

upd 2018/11/4:规律补锅,让代码更加易懂


本来月赛时想打个表,打到一半,发现(n)稳定在(m)附近?

题目的意思是(n < m ^ 2),实际上(n < kn, k approx 6)

所以暴力即可,然后……

记得开longlong,不开longlong爆零见祖宗

code:

#include <cstdio>
#include <vector>
#define ll long long

int main()
{
    ll n = 1, m;
    // 此处的n没什么用,后面会用f.size()
    scanf("%lld", &m);
    std :: vector < ll > f;
    f.push_back(0);
    f.push_back(1);
    for(; f[f.size() - 2] != 0 || f[f.size() - 1] != 1 || f.size() == 2;)
        f.push_back((f[f.size() - 2] + f[f.size() - 1]) % m);
    // for循环写的有些诡异……不过仔细研究一下就明白了
    // 提醒:f.size() == 2时,f(0) == 0, f(1) == 1,但0不是正整数
    printf("%lld", f.size() - 2);
    // f.size() - 2,因为要求的是f(n) == 0 && f(n + 1) == 1 , 而不是f(n - 1) == 0 && f(n) == 1
    return 0;
}

虽然代码还是很丑,但是总比上一次的代码好看多了

原文地址:https://www.cnblogs.com/iycc/p/10217101.html