版权声明:转载需要注明哦QwQ,地址:http://blog.csdn.net/effervescence。 https://blog.csdn.net/Effervescence/article/details/81380820
题意
一个数被称为好的,当且仅当存在一个
x∈[n2+1,n2+2∗n]
使得
x|n4
,给定一个
m(1≤m≤101000)
,找到一个大于等于
m
的最小的好的
n
。
分析(1)
(P.S. 这一部分为正解,大致思路即敦老师的pdf题解[其实就是抄了一遍…加深一下对Pell方程印象])
设
n2+a|n4
,则
n2+a|n4−(n2−a)(n2+a)=a2
,又
a2≤4n2<4(n2+a)
,所以
a2=t(n2+a)
,
t=1,2,3
,接下来就对
t
进行分类讨论。
(1)当
t=1
时,
a2=n2+a
,
a(a−1)=n2
无解。
(2)当
t=2
时,
(a−1)2=2n2+1
,方程
x2−2y2=1
的初始解
(x,y)=(3,2)
,于是通过Pell方程推出通解是
n0=0,n1=2,nk+2=6nk+1−nk
(3)当
t=3
时,
a2=3n2+3a
,设
a=3b
,则
3b2=n2+3b
,设
n=3m
,则
b2=3m2+3b
,
(2b−1)2=12m2+1
,得
x2−12y2=1
,初始解为
(x,y)=(7,2)
,于是原方程初始解为
n0=0,n1=2,nk+2=14nk+1−nk
因为只有这几种情况,而且
t=1
是无解的,所以只存在两个递推式,由于这两个递推式的增长速度很快,所以只要对两个递推式分别暴力枚举到第一个大于等于
m
的数字,取
min
就行了。
Code
n, a, b, c, d = int(input()), 0, 2, 0, 6
while b < n:
b, a = b * 6 - a, b
while d < n:
d, c = d * 14 - c, d
print(min(b, d))
Pell方程
定义
对于形如
x2−Dy2=1
(D是一个固定正整数但不是完全平方数)的方程,我们将它称作Pell方程。
定理
Pell方程总有正整数解,若
(x1,y1)
是使
x1
最小的解,则每个解都可以通过取幂得到:
xk+yk∗D−−√=(x1+y1∗D−−√)k
xn+1=x0xn+Dy0yn
,
yn+1=y0xn+x0yn
xn+2=2x0xn+1−xn
,
yn+2=2x0yn+1−yn
通过这个定理,我们可以将上面分析中的那个Pell方程求出递推关系式,这样就可以解决这个问题了。
分析(2)
据说还有打完表通过一些技巧推完后通过OEIS得出递推式的,这样也能得出正确答案(然而我并不知道怎么做),请聪明的读者自行思考。