鱼C论坛

 找回密码
 立即注册
查看: 1935|回复: 1

[技术交流] 小练习结果揭晓 squarefree的二项式系数

[复制链接]
发表于 2017-8-15 10:02:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
原帖子:http://bbs.fishc.com/thread-93854-1-1.html
题目:

二项式系数 nCk 可以排成帕斯卡三角的形式,如下图:


                               
登录/注册后可看大图


可知,前 8 行中,总共有 12 个不同的数字 1, 2, 3, 4, 5, 6, 7, 10, 15, 20, 21 和 35。对于正整数 n,如果没有任何一个质数的平方可以整除 n,则 n 被叫做 squarefree 。
那么。帕斯卡三角的前 8 行得到的那 12 个不同的数字中,除了 4 和 20,其余都是 squarefree 的。所有 squarefree 数之和是 105。

请给出帕斯卡三角前 51 行中不同的 squarefree 数之和。

题目很简单,就是两个要点,组合和质数,计算组合可以用阶乘的公式也可以用加法一行行的算,加法会更快些。
本题的正确答案是:34029210557338
回答正确的鱼油是:
jerryxjr1220  0.404s
小Q学Python  0.5202s
plus              0.118s
小剑剑            0.218s
hhhhhq         12.458s
达锅               0.076s

用时最短的是:
达锅   
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-8-15 21:40:25 | 显示全部楼层
本帖最后由 夏天和大熊 于 2017-8-15 22:03 编辑

失之毫厘差之千里喽,把判断不满足条件的数直接从列表remove。结果结果差了好多!!代码也写了不够简练,重新改了一遍。参考的小Q的算法。在求杨辉三角中的数时利用对称性以列为单位,只求了一半。
  1. # 给出卡帕斯三角中前n行中所有不同的数
  2. def crt_list(n = 3):
  3.     list_nums = [[1 for i in range(n)]]
  4.     list_kap = [1]
  5.     if n%2 :
  6.         temp = n//2
  7.     else:
  8.         temp = n//2 - 1
  9.     for i in range(temp):
  10.         list_deff = list_nums[i]
  11.         list_column = [1]
  12.         for j in range(1, n-i-1):
  13.             num = list_column[-1] + list_deff[j]
  14.             list_column.append(num)
  15.             if num not in list_kap:
  16.                 list_kap.append(num)
  17.         list_nums.append(list_column)
  18.     return list_kap

  19. # 给出i_end以内的素数表            
  20. def crt_pri(i_end):
  21.     mark_pri = [True for i in range(i_end + 1)]
  22.     mark_pri[0], mark_pri[1] = False, False
  23.     for i in range(2, i_end + 1):
  24.         if mark_pri[i] == True:
  25.             for j in range(i + i, i_end + 1, i):
  26.                 mark_pri[j] = False
  27.     nums_pri = [i for i,j in enumerate(mark_pri) if j == True]
  28.     return nums_pri



  29. # 将所给列表中满足squarefree条件的数加起来
  30. def sum_sqarefree(n = 51):
  31.     list_og = crt_list(n)
  32.     t_start = t.time()
  33.     list_re = []
  34.     list_pri = [i*i for i in crt_pri(int(max(list_og)**0.25) + 1)]
  35.     for each in list_og:
  36.         for i in list_pri:
  37.             if each < i:
  38.                 break
  39.             if each%i == 0:
  40.                 list_re.append(each)
  41.                 break
  42.     t_end = t.time()
  43.     print(t_end - t_start)
  44.     return sum(set(list_og) - set(list_re))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-27 02:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表