求助取石子问题巴什博弈的延伸算法问题Python

两个玩家取石子,最少取一个,最多取 sk 个,
设 S=(s1,s2,........sk), 1<=s1<s2<s3........<sk,获胜的条件是谁最后取完桌上的石子,或者让石子的数量为负数,

我们用 n 表示取到的第n个数,f(n) =0 或 1,(0表示输,1表示赢),要先计算 f(n) 等于0还是1,

公式:f(n)=0,if f(n-s1)=f(n-s2)=.........f(n-sk) = 1; 其他情况 f(n)=1,

把结果用array排列下来,会形成一个比如 011 011 011 011 的循环周期,这个周期的长度等于3,

问题:

用python 实现 input (比如 S=(1,2,3,4), output:循环周期的长度 =

注意:array的存储量不能超过100万,而且S 选择对称的数组,这样就不会出现预周期,

类似1111 011 011 011.........这里的预周期就是最前面的 1111.

S 是对称数组,当si + s(k-1)=sk ,所有i = 1,...,k/2 .

第一个任务艰难的完成了,先看下代码:

图片说明

图片说明

任务2来了,给出S=(s1, s2, 53-s2, 53-s1, 53),求所有S集合里面对称数下计算出来的f(n)值,这个循环需要排列出来。我问n 没有给出具体的界限怎么办,得到的回复是这里的n是随机自然数从(0,1,2........sk)
举例 S=(1,2,3),n=7,那么这里的结果为G的周期的长度是7-3=4.知道了周期是4,就不需要考虑n是不是很大的数。
有没有大佬帮我看一下这个怎么继续写。任务1是在任务2的基础。
谢谢!

取子问题证明和解法: https://www.cnblogs.com/techflow/p/13213069.html
对任意S的组合,直接可以算出是否获胜。相应的,只要按解法取子,f(n)必然是101010的序列.

https://blog.csdn.net/ojshilu/article/details/16812173