题目背景
终于结束的起点
终于写下句点
终于我们告别
终于我们又回到原点
……
一个个 OIer 的竞赛生涯总是从一场 NOIp 开始,大多也在一场 NOIp 中结束,好似一次次轮回在不断上演。
如果这次 NOIp 是你的起点,那么祝你的 OI 生涯如同夏花般绚烂。
如果这次 NOIp 是你的终点,那么祝你的 OI 回忆宛若繁星般璀璨。
也许这是你最后一次在洛谷上打比赛,也许不是。
不过,无论如何,祝你在一周后的比赛里,好运。
当然,这道题也和轮回有关系。
题目描述
广为人知的斐波拉契数列 \mathrm{fib}(n)fib(n) 是这么计算的
也就是 0, 1, 1, 2, 3, 5, 8, 13 \cdots0,1,1,2,3,5,8,13⋯,每一项都是前两项之和。
小 F 发现,如果把斐波拉契数列的每一项对任意大于 11 的正整数 MM 取模的时候,数列都会产生循环。
当然,小 F 很快就明白了,因为 (\mathrm{fib}(n - 1) \bmod Mfib(n−1)modM) 和 (\mathrm{fib}(n - 2) \bmod M)fib(n−2)modM) 最多只有 M ^ 2M2 种取值,所以在 M ^ 2M2 次计算后一定出现过循环。
甚至更一般地,我们可以证明,无论取什么模数 MM,最终模 MM 下的斐波拉契数列都会是 0, 1, \cdots, 0, 1, \cdots0,1,⋯,0,1,⋯。
现在,给你一个模数 MM,请你求出最小的 n > 0n>0,使得 \mathrm{fib}(n) \bmod M = 0, \mathrm{fib}(n + 1) \bmod M = 1fib(n)modM=0,fib(n+1)modM=1。
输入输出格式
输入格式:
输入一行一个正整数 M。
输出格式:
输出一行个正整数 n。
输入输出样例
输入样例#1
2
输出样例#1
3
输入样例#2
6
输出样例#2
24
说明
样例 1 解释
斐波拉契数列为 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, \cdots0,1,1,2,3,5,8,13,21,34,⋯,在对 22 取模后结果为 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, \cdots0,1,1,0,1,1,0,1,1,0,⋯。
我们可以发现,当 n = 3n=3 时,f(n) \bmod 2= 0, f(n + 1) \bmod 2 = 1f(n)mod2=0,f(n+1)mod2=1,也就是我们要求的 nn 的最小值。
数据范围
对于 30\%30% 的数据,M \leq 18M≤18;
对于 70\%70% 的数据,M \leq 2018M≤2018;
对于 100\%100% 的数据,2 \leq M \leq 706150=2≤M≤706150=0xAC666
。
提示
如果你还不知道什么是取模 (\bmod)(mod),那我也很乐意告诉你,模运算是求整数除法得到的余数,也就是竖式除法最终「除不尽」的部分,也即a \bmod M =k \iff a = bM + k\ (M > 0, 0 \leq k < M)amodM=k⟺a=bM+k (M>0,0≤k<M)其中 a, b, ka,b,k 都是非负整数。
如果你使用 C
/ C++
,你可以使用 %
来进行模运算。
如果你使用 Pascal
,你可以使用 mod
来进行模运算。
思路
在同一个世界站起来了,也会站在同一个未来..
距离NOIP2018还有3天。lxy大佬,加油!祝你拿到1=!
xsy大佬,加油!祝你9年级能去清华冬令营。
wwz大佬,加油!祝你rp++,数学数论打表AC。
ACM小队,信息学,NOIP,还有大佬,都是我此生不变的信仰。
洛咕11月月赛第1题
滚动(蛋)数组,如果直接递推的话,数太大了,会爆掉。(除非用高精,但同时也很耗空间)
#include <stdio.h>
#include <iostream>
using namespace std;
int fib[4]={0,0,1,1},n,i;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n;
for(i=1;i;i++)
{
fib[3]=fib[1];
fib[1]=fib[2];
fib[2]=(fib[2]+fib[3])%n;
if(fib[1]%n==0 && fib[2]%n==1)
{
cout<<i<<endl;
return 0;
}
}
}