DeepSeek辅助求解欧拉计划第940题
原题地址https://pe-cn.github.io/940/一开始把题目上传直接让他编写python程序总是不对。试了Qwen也不行Longcat稍好一点S(3)能算出来提到了封闭式还提到了阿克曼函数。最后我将A的递推式变形手工推了一个程序丢给DeepSeek优化defcalculate_A_correct(max_f):# 创建足够大的数组A[[-1]*10for_inrange(10)]# 初始化A[0][0]0A[0][1]1forxinrange(max_f-1):foriinrange(max_f1):forjinrange(max_f1):ifi-10andj-10andA[i][j]-1andA[i1][j-1]!-1andA[i][j-1]!-1:#补算A[i][j]A[i1][j-1]-A[i][j-1]ifi-10andA[i][j]-1andA[i-1][j1]!-1andA[i-1][j]!-1:A[i][j]A[i-1][j1]A[i-1][j]ifi-10andj-10andA[i][j]-1andA[i][j-1]!-1andA[i-1][j-1]!-1:A[i][j]2*A[i][j-1]A[i-1][j-1]#for i in range(max_f1):# print(i, A[i])returnAdefcompute_S(k):# 生成斐波那契数fib[0,1]foriinrange(2,k1):fib.append(fib[-1]fib[-2])max_ffib[k]# 调用正确的A函数计算数组Acalculate_A_correct(max_f)# 计算 S(k)total0foriinrange(2,k1):forjinrange(2,k1):m,nfib[i],fib[j]#print(A, m, n)totalA[m][n]returntotal# 测试print(fS(3) {compute_S(3)})print(fS(4) {compute_S(4)})print(fS(5) {compute_S(5)})print(fS(6) {compute_S(6)})我归纳了手工计算的思路见附件。用多次补算的方法可以得到正确的S(3)和S(5)写法有些累赘请优化不做别的可以了。defcalculate_A_correct(max_f):# 创建足够大的数组初始化为-1表示未计算A[[-1]*(max_f2)for_inrange(max_f2)]# 初始化A[0][0]0A[0][1]1# 循环直到所有需要的值都计算出来changedTruewhilechanged:changedFalseforiinrange(1,max_f1):forjinrange(max_f1):ifA[i][j]!-1:continue# 规则1: A(i, j) A(i-1, j1) A(i-1, j)ifi-10andj1max_fandA[i-1][j1]!-1andA[i-1][j]!-1:A[i][j]A[i-1][j1]A[i-1][j]changedTrue# 规则2: A(i, j) 2*A(i, j-1) A(i-1, j-1)elifi-10andj-10andA[i][j-1]!-1andA[i-1][j-1]!-1:A[i][j]2*A[i][j-1]A[i-1][j-1]changedTrue# 规则3: A(i, j) A(i1, j-1) - A(i, j-1) (从规则1变形)elifi1max_fandj-10andA[i1][j-1]!-1andA[i][j-1]!-1:A[i][j]A[i1][j-1]-A[i][j-1]changedTruereturnAdefcompute_S(k):# 生成斐波那契数fib[0,1]foriinrange(2,k1):fib.append(fib[-1]fib[-2])max_ffib[k]# 调用正确的A函数计算数组Acalculate_A_correct(max_f)# 计算 S(k)total0foriinrange(2,k1):forjinrange(2,k1):m,nfib[i],fib[j]totalA[m][n]%Mreturntotal M1123581313# 测试print(fS(3) {compute_S(3)})print(fS(4) {compute_S(4)})print(fS(5) {compute_S(5)})print(fS(6) {compute_S(6)})print(fS(15) {compute_S(15)%M})速度还是有点慢C:\dtimer64 python 940b.py S(3) 30 S(4) 276 S(5) 10396 S(6) 3544792 S(15) 466892533 Kernel Time 0.015 0% User Time 8.796 99% Process Time 8.812 99% Virtual Memory 65 MB Global Time 8.834 100% Physical Memory 69 MB然后根据一些观察, 让他优化。1 [1, 2, 5, 11, 26, 59, -1, -1, -1, -1]2 [3, 7, 16, 37, 85, 196, -1, -1, -1, -1]3 [10, 23, 53, 122, 281, 647, -1, -1, -1, -1]4 [33, 76, 175, 403, 928, 2137, -1, -1, -1, -1]5 [109, 251, 578, 1331, 3065, 7058, -1, -1, -1, -1]从上表可见A[下一行某列]的元素可以从A[上一行同列]元素 加 A[上一行列加一]的元素求和得到而第一行查询OEIS得到公式a(n) a(n-1) 3*a(n-2)利用这个观察结果改写上一个程序避免无谓的if判断不做别的一开始有问题接着提示2.其他行用递推公式A[m1][n] A[m][n1] A[m][n]需要上一行多算列改为A[i][j] 2*A[i][j-1] A[i-1][j-1] 无需上一行多算列但第0列还是需要用原来的递推公式请改写不做别的可以了。defcalculate_A_correct(max_f):# 创建足够大的数组A[[0]*(max_f2)for_inrange(max_f2)]# 初始化A[0][0]0A[0][1]1# 第一行m0a(n) a(n-1) 3*a(n-2)forninrange(2,max_f1):A[0][n]A[0][n-1]3*A[0][n-2]# 计算其他行forminrange(1,max_f1):# 第0列用递推公式 A[m][0] A[m-1][1] A[m-1][0]A[m][0]A[m-1][1]A[m-1][0]# 其他列用递推公式 A[m][n] 2*A[m][n-1] A[m-1][n-1]forninrange(1,max_f1):A[m][n]2*A[m][n-1]A[m-1][n-1]returnAdefcompute_S(k):# 生成斐波那契数fib[0,1]foriinrange(2,k1):fib.append(fib[-1]fib[-2])max_ffib[k]# 调用正确的A函数计算数组Acalculate_A_correct(max_f)# 计算 S(k)total0foriinrange(2,k1):forjinrange(2,k1):m,nfib[i],fib[j]totalA[m][n]%Mreturntotal M1123581313# 测试print(fS(3) {compute_S(3)})print(fS(4) {compute_S(4)})print(fS(5) {compute_S(5)})print(fS(6) {compute_S(6)})print(fS(18) {compute_S(18)%M})运算结果是C:\dtimer64 python 940c.py S(3) 30 S(4) 276 S(5) 10396 S(6) 3544792 S(18) 536088899 Kernel Time 0.593 18% User Time 2.640 81% Process Time 3.234 100% Virtual Memory 3608 MB Global Time 3.232 100% Physical Memory 3558 MB
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2462069.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!