【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)

posted @ 2018-08-02 23:59  Greenty  阅读(172)  评论(0编辑  收藏  举报