【题解】CF1264F Beautiful Fibonacci Problem

题目链接

讲一个不是官方题解的做法。该做法来自 评论区

题目要求构造 \(a+id\)\(F_{b+ie} \bmod 10^{18}\) 的一个子串。自然考虑把这个子串在一个固定的位置构造。但是打个小一点的表容易发现最后几位是无法构造出所有数字的。

发现 \(a+id<10^6\),也就是说 \(a+id\) 最多 \(6\) 位。考虑空开 \(F_{b+ie}\) 的最后 \(6\) 位,在倒数 \(7\sim12\) 位构造,即使得 \(a+id=F_{b+ie}/10^6\bmod10^6\)

\(p\) 为斐波那契数列 \(\bmod 10^6\) 的循环周期(\(p=1.5\times10^6\))。思考一下 \(F_{kp+1}/10^6\bmod10^6\) 会形成什么。

Lemma: \(F_{n+m+1}=F_nF_m+F_{n+1}F_{m+1}\)

这是一个经典结论,证明网上应该很多,这里就不赘述了。令 \(n=kp,m=p\) 则可以得到: \(F_{(k+1)p+1}\equiv F_{kp}F_p+F_{kp+1}F_{p+1}\)。由 \(p\) 的定义可得等式右边的第一项不影响结果(\(F_{kp}\equiv F_p\equiv 0\pmod {10^6}\Rightarrow F_{kp}F_p\equiv 0\pmod{10^{12}}\),所以倒数 \(7\sim12\) 位均为 \(0\))。

因此我们得到 \(F_{(k+1)p+1}/10^6\bmod10^6=(F_{kp+1}F_{p+1})/10^6\bmod10^6\)。把 \(F_i\) 分成三块考虑:\(A_i=F_i/10^{12}\)\(B_i=F_i/10^6\bmod10^6\)\(C_i=F_i\bmod10^6\)。显然 \(C_{kp+1}=C_{p+1}=1\)。按照这个方式把 \(F_{kp+1}F_{p+1}\) 展开:

\[\begin{aligned} F_{kp+1}F_{p+1}=&\ (A_{kp+1}\times10^{12}+B_{kp+1}\times10^6+1)(A_{p+1}\times10^{12}+B_{p+1}\times10^6+1)\\ =&\ A_{kp+1}A_{p+1}\times10^{24}+(A_{kp+1}B_{p+1}+A_{p+1}B_{kp+1})\times10^{18}+\\ &(A_{kp+1}+A_{p+1}+B_{kp+1}B_{p+1})\times10^{12}+(B_{kp+1}+B_{p+1})\times10^6+1\\ =&\ \text{sth.}\times10^{12}+(B_{kp+1}+B_{p+1})\times10^6+1 \end{aligned} \]

于是可以得到 \(B_{(k+1)p+1}\equiv B_{kp+1}+B_{p+1}\pmod{10^6}\),即我们想要构造出等差数列的地方满足这个结论。考虑到这个结论中的 \(p\) 可以随便乘上一个整数(只要是周期长度就行),我们可以想办法弄出一个 \(B_{xp+1}=1\),这样我们就可以直接构造 \(b=a\cdot x\cdot p + 1\)\(e=d\cdot x\cdot p\)

计算得到 \(B_{p+1}=677449\),那么有 \(B_{xp+1}\equiv 677449x\pmod{10^6}\)。那么我们只需要找到 \(677449\)\(\bmod 10^6\) 意义下的逆元。计算出来 \(x=445049\)

code:

#include <cstdio>

typedef unsigned long long ull;
const ull k = 445049,p = 1.5e6;

ull n,a,d,b,e;

int main() {
    scanf("%llu%llu%llu",&n,&a,&d);
    b = a * k * p + 1,e = d * k * p;
    printf("%llu %llu\n",b,e);
    return 0;
}
posted @ 2022-07-27 14:46  Sya_Resory  阅读(21)  评论(0编辑  收藏  举报