zoukankan      html  css  js  c++  java
  • 【2018牛客多校Round 5 B】div

    题意

    一个数是好的,当且仅当n^4 在[n2+1,n2+2*n]之间有一个约数
    给定m,求 >=m 的最小的好的n
    1 <= m <= 10^(1000)

    分析

    辣鸡数学苦手,靠研究题解勉强搞懂了递推公式的来源(被初中解方程卡住也真是傻逼了),这里就趁着思路还比较清晰,写下详细的推导过程

    首先这个题用到的一个知识点是佩尔方程 , 可以看看电子科技大学算法讲堂

    佩尔方程能解决的问题是形如 x^2 - d×y^2 = 1 的无限解集递归公式

    设 n^2+a (1≤a≤2n)是n^4 的一个约数
    因为 n^2+a 也能被(n2+a)(n2-a)整除
    那么 n^2+a 也能被 n^4 - (n2+a)(n2-a) = a^2 整除
    所以 a^2 = t(n^2+a)
    因为 a≤2n 所以 a^2 ≤ 4(n^2)
    放缩一下 a^2 < 4(n^2+a)
    所以t = 1,2,3
    分类讨论

    1. t = 1
      a^2 = n^2 + a
      即 a(a-1) = n^2
      无解
    2. t = 2
      (a-1)^2 - 2(n^2)=1
      令 x = a-1,y =n
      满足佩尔方程形式
      x_n = x_(n-1) * x_1 + y_(n-1) * y_1
      y_n = x_(n-1) * y_1 + x_1 * y_(n-1)
      此处 x_1 = 3 , y_1 = 2
      上式变为
      x_n = 3 * x_(n-1) + 2 * y_(n-1)
      y_n = 2 * x_(n-1) + 3 * y_(n-1)
      用初中数学知识,将二式中的x用y表示,带入一式,即可得到递推表达式
      y_n = 6 * y_(n-1) -y(n-2) 即为满足条件的n的递推公式
    3. t = 3
      a^2 = 3*n^2 + 3*a
      令a = 3b
      3 *b2=n2+3b
      令n = 3m
      b^2 = 3m^2 + b
      移项配方
      (2b-1)^2 = 12*m^2+1
      令 x = 2b-1 = (2/3)a-1,y =m = n/3
      同样满足佩尔方程形式
      初始值 x_1 = 7,y_1 = 2
      所以能推出
      y_n = 14*y_(n-1)-y_(n-2)
      左右乘3就可以得到n的递推式子

    在t = 2 和 t = 3 分别枚举一下,找到第一个大于m的n,输出两者较小值
    由于这里的数据范围10^1000,所以需要高精度
    因为区域赛已经支持python了,所以直接上py代码

    代码

    m = int(input())
    n0,n1 = 0,2
    while n1 < m:
        t = n1
        n1 = 6*n1-n0
        n0 = t
    ans1 = n1
    n0 ,n1 = 0,6
    while n1 < m:
        t = n1
        n1 = 14*n1 - n0
        n0 = t
    if(ans1 < n1) :
        print(ans1)
    else:
        print(n1)
    
    
  • 相关阅读:
    Jenkins配置国内镜像源
    Centos7安装Jenkins
    IDEA端口占用问题
    dsPIC33F配置ADC软件触发轮询与采样中断的注意事项与区别
    stm32cubemx生成HRTIM DAC等代码及注意事项
    TMS320F28335下载程序到Flash相关问题
    Tms320F28335中AD采样存储地址问题记录
    MatlabR2018a出现“Licence Manager Error -8”
    system级别配置php-开机自启方式
    《费曼学习法》笔记摘要
  • 原文地址:https://www.cnblogs.com/greenty1208/p/9410953.html
Copyright © 2011-2022 走看看