PE-43(枚举)
2015-09-10 00:58
471 查看
题目:https://projecteuler.net/problem=43
分析:数据量不大,一共也就10! = 3628800种排列,枚举即可,这里有几个可以优化的地方:
(1)0不能出现在数字的首位,所以枚举时从1为开头即可
(2)对容易剪枝的条件先判断,例如d2d3d4能被2整除,则d4必须是偶数,这样一半的情况下后面的if都不用算了;对于d4d5d6能被5整除,则d6必须是5或者0,这样后面的if也不用算了
分析:数据量不大,一共也就10! = 3628800种排列,枚举即可,这里有几个可以优化的地方:
(1)0不能出现在数字的首位,所以枚举时从1为开头即可
(2)对容易剪枝的条件先判断,例如d2d3d4能被2整除,则d4必须是偶数,这样一半的情况下后面的if都不用算了;对于d4d5d6能被5整除,则d6必须是5或者0,这样后面的if也不用算了
from itertools import permutations as Permute def AsNumber(lis): n = 0 for d in lis: n = n * 10 + d return n seq = [1, 0] + list(range(2, 10)) res = 0 for arr in Permute(seq, 10): if arr[3] & 1: continue if arr[5] != 5 and arr[5] != 0: continue if sum(arr[2:5]) % 3 or AsNumber(arr[4:7]) % 7 or AsNumber(arr[5:8]) % 11 or \ AsNumber(arr[6:9]) % 13 or AsNumber(arr[7:]) % 17: continue res += AsNumber(arr) print(res)
相关文章推荐
- 黑马程序员 使用final修饰一个变量时,是引用不能变还是引用对象不能变
- HDU3461_Code Lock
- uLua bug fix
- 工作模块功能总结(15)
- 当···时发生了什么?
- 初步13-坐标转换
- UVa-10003 - Cutting Sticks
- lucas 定理学习
- CD4541B定时器的使用方法
- Uva-12118 Inspector's Dilemma
- oracle:通过触发器实现对数据库对象增删改动作的审计
- 多线程的实现方式和安全性
- 创建本地SVN版本库以及将SVN导入GIT
- fuckou
- MOBA游戏草丛系统的个人思路
- java 断言
- ZOJ 3213 Beautiful Meadow(插头DP)
- 使用编译原理,把逻辑编排交给策划
- 广州实时公交查询系统调研
- AWS ECS 的auto scaling