leetcode459奇妙做法的数学解释
来源:互联网 发布:python爬虫爬小说赚钱 编辑:程序博客网 时间:2024/05/21 17:25
前言
前几天做了下leetcode459,这道看起来平淡无奇的题目,却是如此的好玩。我们经常看网上一些人写的题解,粗暴,直接上代码,然后唯一的中文是“水题,不解释”,科科哒,港真,有多少人知道其数学原理,反正我是不建议轻视每一个我们碰到的问题。
首先,回顾一下问题:
简单的说,就是判断一个字符串是否能完全被自身一个子串多次拼接得到。比如“ababab”可以由“ab”拼接而成(我们称之为“好串”),“ababc”则不存在一个子串能拼接出原字符串。
碰到问题,暴力先行,我们可以简单地给出一种暴力的方法:
class Solution: def repeatedSubstringPattern(self, s): """ :type s: str :rtype: bool """ for x in range(int(len(s)/2)): temp=s[0:(x+1)] times=int(len(s)/(x+1)) if temp*times==s: return True return False
实际上就是遍历
然后,标答的话,应该是采用
class Solution: def repeatedSubstringPattern(self, s): return s in (2 * s)[1:-1]
是的,就是一行,这里剧透一下,这是
(算法1)
1. 用两个s 首尾相连得到一个新的字符串ss ;
2. 去掉ss 的首尾两个字符;
3. 如果在剩下来的字符串中能找到s 那么返回True,否则False
实在是惊人,经过一段时间的思考,终于给出了这个方法的证明,在这个过程中想到了很多东西,非常兴奋,兴奋得我跑去清青快餐吃了一波,然后下面的话,我将会给出我的完整的思考过程(和以前一样,我认为记录思考过程比记录冷冰冰的证明要有意义得多,或者你可以直接拖到后面看证明)
思考过程
如图所示,
记序列
为了方便起见,上式中的下标是mod n意义下的,换句话说
(猜想1)若有
at=at+n 以及at=at+k ,k≤n ,那么一定存在一个r|n ,使得at=at+r.
如果猜想1成立,那么我们就可以判定,算法1可以用来判断“好串”(
(猜想2)若有
at=at+n 以及at=at+k ,k≤n ,那么at=at+gcd(k,n) .
此时,我做了一些实验,下面展示一些例子(不断+4然后取模6),
1.
上图中颜色相近的表示的是值相同(颜色深浅是为了方便读者阅读),实际上就是下图中的好串,它确实有周期
有了上述实验后,我再做了一个尝试(直觉告诉我不妨做个互质情况的实验)
2.
很高兴,和我的猜想一致,它确实有
重新再以
此时我突然想到一些东西,我印象中好像有这么一个定理:
(定理1)对于常系数齐次线性递推公式
an+k=∑ki=1ckan+i−1 ,若m>1 ,那么数列{an} 模m 后是周期数列.
我能不能将等差数列转换为常系数齐次线性递推公式,然后通过定理1的某些性质来直接证明猜想2呢?先来看看,
也就是说,我们有
完整证明
回顾一下,由已知存在
我们只要证明猜想2,我们就能说明算法1给出True的判断就是好串,False的结果必然是非好串。这主要是因为
(猜想2)若有
at=at+n 以及at=at+k ,k≤n ,那么at=at+gcd(k,n) .
下面我们来证明猜想2,首先我们有如下引理:
(引理1)用
lcm(m,k) 和gcd(m,k) 来表示m,k 的最小公倍数和最大公约数,那么我们有lcm(m,k)⋅gcd(m,k)=mk .
接下来给出关于一次线性同余方程解得存在性定理:
(引理2:线性同余式定理)设
a,b,m∈N+ ,给定一次同余方程ax≡b(modm) ,
(1)若gcd(a,m)|b ,那么同余方程有gcd(a,m) 个在模m 的不同解,如果有特解x0 ,那么全部解得形式为x=x0+t⋅m/gcd(a,m) ,t=0,1,...,gcd(a,m)−1 ;
(2)若不整除,那么同余方程不存在解.
我们考虑序列下标序列
(第一步)我们先证明:
这等价于
(第二步)接下来,固定
若有
回到原猜想2(再次重申,所有的下标就是模
上式中的元构成的集合我们称为等价类
A′t 中的元有at+p⋅gcd(k,n) 的形式(0≤p≤ngcd(k,n)−1 );- 存在双射
f :A′t→At .
这样的话
取定
在
同理,取定
在
所以上面两个同余方程的解唯一性保证了
————————————————
后记
由上面的思考,顺便得到如下结论:
(结论1)对等差数列
ak+t ,a∈N+ ,取mod n后所得到的周期数列,必有周期n/gcd(k,n) ,且n/gcd(k,n) 为最小正周期.
修改一下结论1有:
(结论2)常系数齐次线性递推公式
Aa+1=2Aa−Aa−1 取mod n后所得到的周期数列的周期完全取决于初值.
进一步的思考:
(作业)若有
at=at+ki ,其中i=1,2...n ,那么是否有at=at+gcd(k1,k2,...,kn)? .
如果,上面的这个作业成立的话,那么由之前我的这篇博文:从Happy num所想到的几个问题 最后提到任取k个自然数,它们互素的概率为
- leetcode459奇妙做法的数学解释
- leetcode459
- 关于CUDA4.1 NVCC一个奇妙的BUG 的解释
- 非负矩阵分解:数学的奇妙力量
- 非负矩阵分解:数学的奇妙力量
- zz非负矩阵分解:数学的奇妙力量
- 奇妙的数学 · 完全平方数~总结
- bzoj 2813: 奇妙的Fibonacci 数学+线性筛
- Cocos2d宏的数学解释
- Cocos2d宏的数学解释
- 逗号表达式的数学解释
- 神经网络的简单数学解释
- SVD的数学解释,好文要顶
- jdoj 1930 慈善的约瑟夫 递推 数学做法
- 奇妙的Python:让人无法解释的输出(一)
- 网易笔试题之数字反转(数学真的奇妙)
- 听到这样的解释之后,林晓第一个感觉就是“这个世界真奇妙
- 3D数学 ---- 矩阵的几何解释
- 从头开始学Node.js,讲的很好,可以学习他的系列讲解
- 产品测试规范(二)
- std::vector<bool>
- 数据结构第十一周项目(二)——操作用邻接表存储的图
- Unix中的段
- leetcode459奇妙做法的数学解释
- JZOJ5498. 【清华集训2017模拟12.10】大佬的难题
- Web性能测试
- ViewPager的addOnPageChangeListener方法详解
- 数据结构学期总结
- webstorm通过git把代码上传到码云。
- php处理图像圆形
- intcode统计数字 java
- Machine Learning part5---可视化