「P4994」「洛谷11月月賽」 終於結束的起點(枚舉
題目背景
終於結束的起點
終於寫下句點
終於我們告別
終於我們又回到原點
……
一個個 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。
輸入輸出格式
輸入格式:
輸入一行一個正整數 MM。
輸出格式:
輸出一行一個正整數 nn。
輸入輸出樣例
輸入樣例#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
來進行模運算。
題解
如果這次 NOIp 是你的終點,那麽祝你的 OI 回憶宛若繁星般璀璨。
哈哈哈哈為什麽要一上來就放催淚彈啊一點都不感動嚶嚶嚶嚶
一開始淡定的打表找規律,發現跟因子有些關系,大概就是對很多數而言是質因子的f乘起來再乘反復出現的質因子之類......
然後不想肝了掛了個機跑1~706150的答案,記了個最大值,好像最大值只是個211多少的六位數......
那還規律個鬼啊,暴力啊!
1 /* 2 qwerta 3 P4994 終於結束的起點 Accepted 4 100 5 代碼 C++,0.25KB 6 比賽 【LGR-055】洛谷11月月賽 7 提交時間 2018-11-04 09:08:05 8 耗時/內存 70ms, 808KB 9 */ 10 #include<iostream> 11 #include<cstdio> 12 #include<cmath> 13 using namespace std; 14 int main() 15 { 16 int m; 17 scanf("%d",&m); 18 int f0=1,f1=1; 19 for(long long n=2;;++n) 20 { 21 int x=(f0+f1)%m; 22 if(f1==0&&x==1) 23 { 24 cout<<n; 25 break; 26 } 27 f0=f1; 28 f1=x; 29 } 30 return 0; 31 }
「P4994」「洛谷11月月賽」 終於結束的起點(枚舉