zoukankan      html  css  js  c++  java
  • 1264 F. Beautiful Fibonacci Problem

    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
    
  • 相关阅读:
    计时器C#
    MySQL Database Command Line Client
    C#小爬虫,通过URL进行模拟发送接收数据
    C#导入导出Excele数据
    正则表达式动态分隔符
    C#中的枚举
    C#中的ToString格式大全
    C# 序列化与反序列化
    C# 对xml进行操作
    时间标签DateTime
  • 原文地址:https://www.cnblogs.com/Heltion/p/12331205.html
Copyright © 2011-2022 走看看