由1,2,2,3,3,3,4,4,4,4……推出公式

目录

  • 引入
  • 推导过程
  • 题目
  • 代码
    • C++
    • Python
  • 总结


本文由Jzwalliser原创,发布在CSDN平台上,遵循CC 4.0 BY-SA协议。
因此,若需转载/引用本文,请注明作者并附原文链接,且禁止删除/修改本段文字。
违者必究,谢谢配合。
个人主页:blog.csdn.net/jzwalliser

引入

在一个数列 1 1 1 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5……中,请问第 n n n项是数字几呢?

推导过程

给数列标个号:

n n n 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 6 6 6 7 7 7 8 8 8 9 9 9 10 10 10 11 11 11 12 12 12 13 13 13 14 14 14 15 15 15 16 16 16
m n m_n mn 1 1 1 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6

然后提取一些特殊的数据:当数字 1 1 1第一次出现时序号为 1 1 1 2 2 2第一次出现时序号为 2 2 2 3 3 3第一次出现时序号为 4 4 4……

n n n 1 1 1 2 2 2 4 4 4 7 7 7 11 11 11 16 16 16
m n m_n mn 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 6 6 6

然后再修改一下这个表(我们一步一步来):

n n n 1 1 1 2 2 2 4 4 4 7 7 7 11 11 11 16 16 16
n − 1 n-1 n1 0 0 0 1 1 1 3 3 3 6 6 6 10 10 10 15 15 15
m n m_n mn 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 6 6 6
n n n 1 1 1 2 2 2 4 4 4 7 7 7 11 11 11 16 16 16
n − 1 n-1 n1 0 0 0 1 1 1 3 3 3 6 6 6 10 10 10 15 15 15
m n m_n mn 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 6 6 6
n n n 1 1 1 2 2 2 4 4 4 7 7 7 11 11 11 16 16 16
n − 1 n-1 n1 0 0 0 1 1 1 3 3 3 6 6 6 10 10 10 15 15 15
2 ( n − 1 ) 2(n-1) 2(n1) 0 0 0 2 2 2 6 6 6 12 12 12 20 20 20 30 30 30
m n m_n mn 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 6 6 6

此时,将 2 ( n − 1 ) 2(n-1) 2(n1)拆分为 x × y x\times y x×y,其中 x = y − 1 x=y-1 x=y1 x ∈ Z + , y ∈ Z + x\in\mathbb Z_+,y\in\mathbb Z_+ xZ+,yZ+

n n n 1 1 1 2 2 2 4 4 4 7 7 7 11 11 11 16 16 16
n − 1 n-1 n1 0 0 0 1 1 1 3 3 3 6 6 6 10 10 10 15 15 15
2 ( n − 1 ) 2(n-1) 2(n1) 0 0 0 2 2 2 6 6 6 12 12 12 20 20 20 30 30 30
x x x 0 0 0 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5
y y y 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 6 6 6
m n m_n mn 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 6 6 6

发现了吗?这里 y = m n y=m_n y=mn x + 1 = m n x+1=m_n x+1=mn就是我们找到的规律!!!
接下来可以列出式子:

{ x = y − 1 x y = 2 × ( n − 1 ) y = m n \left\{ \begin{aligned} &x=y-1 \\ &xy=2\times(n-1) \\ &y=m_n \end{aligned} \right. x=y1xy=2×(n1)y=mn
化简可得:
m n 2 − m n − 2 n + 2 = 0 m_n^2-m_n-2n+2=0 mn2mn2n+2=0
用二次方程求根公式解:
m n = − b ± b 2 − 4 a c 2 a = − ( − 1 ) ± ( − 1 ) 2 − 4 × 1 × ( 2 − 2 n ) 2 × 1 = 1 ± 8 n − 7 2 m_n=\frac{-b\pm\sqrt{b^2-4ac}}{2a}=\frac{-(-1)\pm\sqrt{(-1)^2-4\times1\times(2-2n)}}{2\times1}=\frac{1\pm\sqrt{8n-7}}{2} mn=2ab±b24ac =2×1(1)±(1)24×1×(22n) =21±8n7
所以解出两个解:
m n 1 = 1 + 8 n − 7 2 , m n 2 = 1 − 8 n − 7 2 m_{n_1}=\frac{1+\sqrt{8n-7}}{2},m_{n_2}=\frac{1-\sqrt{8n-7}}{2} mn1=21+8n7 ,mn2=218n7
舍去负根,即可得到m与n的关系:
m n = 1 + 8 n − 7 2 m_n=\frac{1+\sqrt{8n-7}}{2} mn=21+8n7

再列一张表验证一下:

n n n 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 6 6 6 7 7 7 8 8 8 9 9 9 10 10 10 11 11 11
m n m_n mn 1 1 1 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5
1 + 8 n − 7 2 \frac{1+\sqrt{8n-7}}{2} 21+8n7 1 1 1 2 2 2 2.561 2.561 2.561 3 3 3 3.372 3.372 3.372 3.701 3.701 3.701 4 4 4 4.274 4.274 4.274 4.531 4.531 4.531 4.772 4.772 4.772 5 5 5

然后我们发现,由公式得出的结果有些过分精准了,其实我们只需要取结果的整数部分就行。

所以,再套一个取整:
m n = ⌊ 1 + 8 n − 7 2 ⌋ m_n=\lfloor\frac{1+\sqrt{8n-7}}{2}\rfloor mn=21+8n7
至此,大功告成。

题目

有一些信息题用到了这个公式,如:
洛谷 P2669 [NOIP2015 普及组] 金币

代码

C++

int m(int n){
	return (1 + sqrt(8 * n - 7)) / 2;
}

Python

m = lambda n:int((1 + math.sqrt(8 * n - 7)) / 2)

总结

今天就分享到这里啦,希望您有所收获。
创作不易,记得一键三连哦!

你可能感兴趣的:(算法,算法)