1. 程式人生 > >「P4994」「洛谷11月月賽」 終於結束的起點(枚舉

「P4994」「洛谷11月月賽」 終於結束的起點(枚舉

一次 分享 ted main orange 多少 質因子 生涯 nbsp

題目背景

終於結束的起點
終於寫下句點
終於我們告別
終於我們又回到原點
……

一個個 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(n1)modM) 和 (\mathrm{fib}(n - 2) \bmod M)fib(n2)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 18M18;

對於 70\%70% 的數據,M \leq 2018M2018;

對於 100\%100% 的數據,2 \leq M \leq 706150=2M706150=0xAC666

提示

如果你還不知道什麽是取模 (\bmod)(mod),那我也很樂意告訴你,模運算是求整數除法得到的余數,也就是豎式除法最終「除不盡」的部分,也即a \bmod M =k \iff a = bM + k\ (M > 0, 0 \leq k < M)amodM=k?a=bM+k (M>0,0k<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月月賽」 終於結束的起點(枚舉