题目背景
终于结束的起点
终于写下句点
终于我们告别
终于我们又回到原点
……
一个个 OIer 的竞赛生涯总是从一场 NOIp 开始,大多也在一场 NOIp 中结束,好似一次次轮回在不断上演。
如果这次 NOIp 是你的起点,那么祝你的 OI 生涯如同夏花般绚烂。
如果这次 NOIp 是你的终点,那么祝你的 OI 回忆宛若繁星般璀璨。
也许这是你最后一次在洛谷上打比赛,也许不是。
不过,无论如何,祝你在一周后的比赛里,好运。
当然,这道题也和轮回有关系。
题目描述
广为人知的斐波拉契数列fib(n) 是这么计算的
fib(0)=0;
fib(1)=1;
fib(n)=fib(n-1)+fib(n-2);
也就是 0, 1, 1, 2, 3, 5, 8, 13 ⋯,每一项都是前两项之和。
小 F 发现,如果把斐波拉契数列的每一项对任意大于 11 的正整数 MM 取模的时候,数列都会产生循环。
当然,小 F 很快就明白了,因为fib(n−1)modM 和fib(n−2)modM)最多只有 M ^ 2 种取值,所以在 M ^ 2 次计算后一定出现过循环。
甚至更一般地,我们可以证明,无论取什么模数 MM,最终模 MM 下的斐波拉契数列都会是 0,1,⋯,0,1,⋯。
现在,给你一个模数 M,请你求出最小的 n>0,使得 fib(n)modM=0,fib(n+1)modM=1。
输入输出格式
输入格式:
输入一行一个正整数 MM。
输出格式:
输出一行一个正整数 nn。
输入输出样例
输入样例#1: 复制
2
输出样例#1: 复制
3
输入样例#2: 复制
6
输出样例#2: 复制
24
说明
样例 1 解释
斐波拉契数列为 0,1,1,2,3,5,8,13,21,34,⋯,在对 22 取模后结果为 0, 1, 1, 0, 1, 1, 0, 1, 1, 0。
我们可以发现,当 n=3 时,f(n) \bmod 2= 0, f(n + 1) \bmod 2 = 1也就是我们要求的 nn 的最小值。
数据范围
对于 30% 的数据,M≤18;
对于 70% 的数据,M≤2018;
对于 100% 的数据,2≤M≤706150=0xAC666
。
这题数据范围很水,暴力扫一遍就行。}这题数据范围很水,暴力扫一遍就行。但有一点要注意,数组要循环起来(三个就够了,定义为a,b,c),不然会爆内存。}但有一点要注意,数组要循环起来(三个就够了,定义为a,b,c),不然会爆内存。求斐波那契数列时要不停取模,否则到八九十就会爆long long。}求斐波那契数列时要不停取模,否则到八九十就会爆long long。最后附上核心代码:最后附上核心代码:
a=b%m;
b=c%m;
c=(a+b)%m;//循环起来,超节省空间,记得不断模m,这点很重要。
if(b==0&&c==1) break;//判断条件,输出符合条件的n;