1264 F. Beautiful Fibonacci Problem
题意:
给出长度为(n)的等差数列(a_i=a+(i-1)cdot d(1leq 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}^ppmod{10^{2k}}.)
如果(F_{n+1}=10^ku+1),那么(F_{pn+1}equiv10^kpu+1pmod{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)+1pmod{10^{2k}}).
但是,(u^{-1})其实不一定存在.以(k=6)为例,当(n=3cdot 10^k)的时候,(gcd(u,10)=2),因此需要修正为(F_{n+1}=2ucdot10^k+1),并取(b=5au^{-1}cdot n+1,e=5du^{-1}n),这样就可以保证(F_{b+ei}equiv(a+bi)10^{k+1}+1pmod{10^{2k}}).
主要代码
构造代码:
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