1. 程式人生 > >[洛谷P4994 終於結束的起點 (#模擬 -1.25)

[洛谷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;
		}
	}
}