[洛谷P4994 終於結束的起點 (#模擬 -1.25)
題目背景
終於結束的起點
終於寫下句點
終於我們告別
終於我們又回到原點
……
一個個 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;
}
}
}