牛客网暑期ACM多校训练营(第五场)B. div(技巧+OEIS or Pell方程)

版权声明:转载需要注明哦QwQ,地址:http://blog.csdn.net/effervescence。 https://blog.csdn.net/Effervescence/article/details/81380820

题意

  一个数被称为好的,当且仅当存在一个 x [ n 2 + 1 , n 2 + 2 n ] 使得 x | n 4 ,给定一个 m ( 1 m 10 1000 ) ,找到一个大于等于 m 的最小的好的 n

分析(1)

  (P.S. 这一部分为正解,大致思路即敦老师的pdf题解[其实就是抄了一遍…加深一下对Pell方程印象])
  设 n 2 + a | n 4 ,则 n 2 + a | n 4 ( n 2 a ) ( n 2 + a ) = a 2 ,又 a 2 4 n 2 < 4 ( n 2 + a ) ,所以 a 2 = t ( n 2 + a ) t = 1 , 2 , 3 ,接下来就对 t 进行分类讨论。
  (1)当 t = 1 时, a 2 = n 2 + a a ( a 1 ) = n 2 无解。
  (2)当 t = 2 时, ( a 1 ) 2 = 2 n 2 + 1 ,方程 x 2 2 y 2 = 1 的初始解 ( x , y ) = ( 3 , 2 ) ,于是通过Pell方程推出通解是 n 0 = 0 , n 1 = 2 , n k + 2 = 6 n k + 1 n k
  (3)当 t = 3 时, a 2 = 3 n 2 + 3 a ,设 a = 3 b ,则 3 b 2 = n 2 + 3 b ,设 n = 3 m ,则 b 2 = 3 m 2 + 3 b ( 2 b 1 ) 2 = 12 m 2 + 1 ,得 x 2 12 y 2 = 1 ,初始解为 ( x , y ) = ( 7 , 2 ) ,于是原方程初始解为 n 0 = 0 , n 1 = 2 , n k + 2 = 14 n k + 1 n k
  因为只有这几种情况,而且 t = 1 是无解的,所以只存在两个递推式,由于这两个递推式的增长速度很快,所以只要对两个递推式分别暴力枚举到第一个大于等于 m 的数字,取 m i n 就行了。

Code

# 偷懒用python[雾]
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方程

定义

  对于形如 x 2 D y 2 = 1 (D是一个固定正整数但不是完全平方数)的方程,我们将它称作Pell方程。

定理

  Pell方程总有正整数解,若 ( x 1 , y 1 ) 是使 x 1 最小的解,则每个解都可以通过取幂得到:
   x k + y k D = ( x 1 + y 1 D ) k
   x n + 1 = x 0 x n + D y 0 y n y n + 1 = y 0 x n + x 0 y n
   x n + 2 = 2 x 0 x n + 1 x n y n + 2 = 2 x 0 y n + 1 y n
  通过这个定理,我们可以将上面分析中的那个Pell方程求出递推关系式,这样就可以解决这个问题了。

分析(2)

  据说还有打完表通过一些技巧推完后通过OEIS得出递推式的,这样也能得出正确答案(然而我并不知道怎么做),请聪明的读者自行思考。

猜你喜欢

转载自blog.csdn.net/Effervescence/article/details/81380820
今日推荐