1264 F. Beautiful Fibonacci Problem

1264 F. Beautiful Fibonacci Problem

题意:
给出长度为\(n\)的等差数列\(a_i=a+(i-1)\cdot d(1\leq n,d,a_i<10^6)\),求另一个等差数列\(b_i=b+(i-1)\cdot e(b,e>0)\)使得Fibonacci数列第\(b_i\)\(F_{b_i}\)十进制表示末尾\(18\)位(不足则考虑所有位)中存在子串是\(a_i\)的十进制表示.
题解:
根据Pisano periods,对于每个整数\(p\)都存在\(n\)使得\(F_i=F_{i+n}\pmod{p}\).
因此存在\(n\)使得\(F_i=F_{i+n}\pmod{10^k}\).
根据公式\(F_{m+n}=F_mF_{n+1}+F_{m-1}F_n\)可以得到\(F_{(p+1)n+1}=F_{pn+1}F_{n+1}+F_{pn}F_{n}\equiv F_{pn+1}F_{n+1}\pmod{10^{2k}},\)归纳可得\(F_{pn+1}\equiv F_{n+1}^p\pmod{10^{2k}}.\)
如果\(F_{n+1}=10^ku+1\),那么\(F_{pn+1}\equiv10^kpu+1\pmod{10^{2k}}.\)
如果令\(b=au^{-1}\cdot n+1,e=du^{-1}n(u^{-1}\)是模\(10^{k}\)意义下逆元),那么就有\(F_{b+ei}=F_{(a+ei)u^{-1}n+1}\equiv 10^k(a+di)+1\pmod{10^{2k}}\).
但是,\(u^{-1}\)其实不一定存在.以\(k=6\)为例,当\(n=3\cdot 10^k\)的时候,\(\gcd(u,10)=2\),因此需要修正为\(F_{n+1}=2u\cdot10^k+1\),并取\(b=5au^{-1}\cdot n+1,e=5du^{-1}n\),这样就可以保证\(F_{b+ei}\equiv(a+bi)10^{k+1}+1\pmod{10^{2k+1}}\).
主要代码
构造代码:

k = 1000000
def F(n):
    if n == 0:
        return (0, 1)
    p = F(n // 2)
    c = p[0] * (2 * p[1] - p[0] + (k * k)) % (k * k)
    d = (p[0] * p[0] + p[1] * p[1]) % (k * k)
    if n % 2:
        return (d, c + d)
    return (c, d)
print(F(3 * k))#print: (709796000000, 354898000001)
for i in range(k):
    if(i * 354898 / 2 % k == 1):
        print(i)#print : 945049

猜你喜欢

转载自www.cnblogs.com/Heltion/p/12331205.html