希望是这道题的第一篇题解,并且真的做到了!
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;
}
虽然代码还是很丑,但是总比上一次的代码好看多了