1. 程式人生 > 其它 >Codeforces 1264F - Beautiful Fibonacci Problem(猜結論+找性質)

Codeforces 1264F - Beautiful Fibonacci Problem(猜結論+找性質)

猜結論+找性質的 nb tea

Codeforces 題面傳送門 & 洛谷題面傳送門

一道名副其實(beautiful)的結論題。

首先看到這道設問方式我們可以很自然地想到套用斐波那契數列的恆等式,注意到這裡涉及到 \(F_{a+id}\),因此考慮斐波那契數列組合恆等式 \(F_{m+n+1}=F_mF_{n}+F_{m+1}F_{n+1}\),具體證明戳這裡,這裡就不再贅述了。

注意到此題還涉及後 \(18\) 位,也就是要將斐波那契數列的各種運算放到模 \(10^{18}\) 意義下進行,因此我們可以考慮找一下斐波那契數列在模 \(10^{18}\) 意義下的迴圈節,打個表可以發現斐波那契數列在模 \(10,100,1000,10000,100000,\cdots\)

意義下的迴圈節恰好是 \(60,300,1500,15000,150000\),後面依次乘 \(10\)(From my 題解 of Codeforces 193E)因此斐波那契數列在模 \(10^k(k\ge 3)\) 意義下的迴圈節為 \(1.5\times 10^k\),也就是說一定有 \(F_{1.5\times 10^k·i}\equiv 0\pmod{10^k}\),我們在下文中令 \(N=12\times 10^k\)(官方題解是 \(12\times 10^k\),至於為什麼這麼做我也不知道,反正對於我這種菜雞而言,這種難度的題我只能搬官方題解/ll/wq),那麼顯然 \(1.5\times 10^k\mid N\),因此可以得到第一個非常 trivial 的結論:

Observation \(1\). \(F_{Ni}\equiv 0\pmod{10^k}(i\in\mathbb{N}_+)\)

接下來我們考慮再來觀察一些性質,可以注意到 \(F_{2N+1}=F_{N+1}^2+F_N^2\equiv F_{N+1}^2\pmod{10^{2k}}\)\(F_{3N+1}=F_{2N+1}F_{N+1}+F_{2N}F_N\equiv F_{2N+1}F_{N+1}\equiv F_{N+1}^3\pmod{10^{2k}}\),如此歸納下去可以得到一個普遍性的結論:

Observation \(2\). \(F_{xN+1}\equiv F_{N+1}^x\pmod{10^{2k}},x\in\mathbb{N}_+\)

接下來考慮探究一下這個 \(F_{N+1}\) 又有什麼性質,有一個我也不知道怎麼推出來(有哪位好心的鴿鴿教教蒟蒻這東西怎麼證明啊 qwq/kel)的性質:

Observation \(3\). \(F_{N+1}\) 可以寫成 \(8\times 10^k·t+1\) 的形式,其中 \(t\perp 10\)

證明不會

因此我們有 \(F_{xN+1}=F_{N+1}^x=(8\times 10^k·t+1)^x\),而我們暴力二項式定理將這東西展開就會發現平方項以上模 \(10^{2k}\) 都等於 \(0\),因此我們只用保留 \(1\) 次項和 \(0\) 次項即可,即

Observation \(4\). \(F_{xN+1}\equiv 8\times 10^k·t·x+1\pmod{10^{2k}}\)

接下來回到原問題,我們顯然希望對每個 \(v=a+ix,i\in\mathbb{Z}\cap[0,n)\) 找到一個 \(p\) 滿足 \(F_p\equiv v·10^u+q\pmod{10^{18}}\),其中 \(u\le 12,q<10^{u}\),這樣原問題顯然就做完了,因為這樣從 \(10^u\) 位開始往後數一定可以得到 \(v\)。由於我們這些操作要放在模 \(10^{18}\) 意義下進行,因此我們取 \(k=9\),此時 \(N=1.2\times 10^{10}\),我們考慮令 \(X=125·t^{-1}·a\bmod{10^9},Y=125·t^{-1}·d\bmod{10^9}\),其中 \(t^{-1}\) 表示 \(t\) 在模 \(10^9\) 意義下的逆元,那麼我們構造 \(b=XN+1,e=YN\) 符合題意,因為:

\[\begin{aligned} &F_{b+ie}\\ =&F_{(X+iY)N+1}\\ \equiv&8·10^9·t·(X+iY)+1\\ \equiv&8·10^9·t·125·t^{-1}(a+id)+1\\ =&10^{12}·(10^9k+1)·(a+id)+1\\ \equiv&10^{12}·(a+id)+1\pmod{10^{18}} \end{aligned} \]

符合我們剛才的構造。

一句話來說就是 \(b=368131125a\bmod 10^9·1.2\times 10^{10}+1,e=368131125d\bmod 10^9+1.2\times 10^{10}\)

於是我們就做完了這個難度 3.5k 的題(

程式碼(只有短短的 8 行):

#include <cstdio>
int n,a,d;
unsigned long long m=368131125,mod=1e9,x=1.2e10;
int main(){
	scanf("%d%d%d",&n,&a,&d);
	printf("%llu %llu\n",m*a%mod*x+1,m*d%mod*x);
	return 0;
}