楼主: 〇〇

Project Euler Problem 276, 268, 347

[复制链接]
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
91#
 楼主| 发表于 2012-2-7 07:37 | 只看该作者
〇〇 发表于 2012-2-6 14:29
从前几个结果看出:要么a c都是完全平方数,要么都是完全平方数的同样的倍数

         A  SQRT(A*C)   ...

感觉也可以筛法
a先从质数平方a0^2开始试验,如果不成功,再试验x*a0^2 成功一个,然后后面n个都可筛掉

使用道具 举报

回复
论坛徽章:
10
CTO参与奖
日期:2009-02-20 09:44:20ITPUB年度最佳技术原创精华奖
日期:2013-03-22 13:18:30迷宫蛋
日期:2012-05-07 10:55:58茶鸡蛋
日期:2012-04-19 16:08:262012新春纪念徽章
日期:2012-01-04 11:54:462011新春纪念徽章
日期:2011-01-04 10:24:02数据库板块每日发贴之星
日期:2010-12-19 01:01:02数据库板块每日发贴之星
日期:2010-12-13 01:01:012009日食纪念
日期:2009-07-22 09:30:00优秀写手
日期:2014-02-08 06:00:12
92#
发表于 2012-2-8 23:13 | 只看该作者
〇〇 发表于 2012-2-6 14:29
从前几个结果看出:要么a c都是完全平方数,要么都是完全平方数的同样的倍数

         A  SQRT(A*C)   ...

与做Q75时同样, 可以把Geometric triangles 分成素的和非素的。
素Geometric triangles 就是说gcd(a,b,c)=1
100以内满足这样条件的:

         A  SQRT(A*C)          C
---------- ---------- ----------
         4          6          9
         9         12         16
        16         20         25
        25         30         36
        25         35         49
        25         40         64
        36         42         49
        49         56         64
        49         63         81
        49         70        100
        64         72         81
        81         90        100

可以看到a/c都是完全平方数。
证明方法暂时没想到。

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
93#
发表于 2012-2-8 23:27 | 只看该作者
本帖最后由 lastwinner 于 2012-2-8 23:27 编辑
〇〇 发表于 2012-2-6 12:33
Problem 370
05 February 2012

周长不超过10^6的三角形,如果三边长a/b/c满足a/b/c均为整数,a<=b<=c且b^2 = a * c,那么这样的三角形共有861805 个
请问,若周长不超过2.5·10^13,这样的三角形共有多少个?
不知我翻译的对不对?

使用道具 举报

回复
论坛徽章:
10
CTO参与奖
日期:2009-02-20 09:44:20ITPUB年度最佳技术原创精华奖
日期:2013-03-22 13:18:30迷宫蛋
日期:2012-05-07 10:55:58茶鸡蛋
日期:2012-04-19 16:08:262012新春纪念徽章
日期:2012-01-04 11:54:462011新春纪念徽章
日期:2011-01-04 10:24:02数据库板块每日发贴之星
日期:2010-12-19 01:01:02数据库板块每日发贴之星
日期:2010-12-13 01:01:012009日食纪念
日期:2009-07-22 09:30:00优秀写手
日期:2014-02-08 06:00:12
94#
发表于 2012-2-8 23:34 | 只看该作者
本帖最后由 tree_new_bee 于 2012-2-8 23:59 编辑

把上面的数,给出出a/b=b/c的最简化分数:
A        SQRT(A*C)        C        
4        6        9        2/3
9        12        16        3/4
16        20        25        4/5
25        30        36        5/6
25        35        49        5/7
25        40        64        5/8
36        42        49        6/7
49        56        64        7/8
49        63        81        7/9
49        70        100        7/10
64        72        81        8/9
81        90        100        9/10

就可以看到构造方法了: 取数对p,q, 使得gcd(p,q)=1, 且p<q<2p (证明: 因为p+q >q*q/p 且q>p, 所以pp+pq>qq, 所以2pq>qq, 所以2p>q)
然后,用p^2, p*q, q^2, 就可以构造出素Geometric triangles。

使用道具 举报

回复
论坛徽章:
10
CTO参与奖
日期:2009-02-20 09:44:20ITPUB年度最佳技术原创精华奖
日期:2013-03-22 13:18:30迷宫蛋
日期:2012-05-07 10:55:58茶鸡蛋
日期:2012-04-19 16:08:262012新春纪念徽章
日期:2012-01-04 11:54:462011新春纪念徽章
日期:2011-01-04 10:24:02数据库板块每日发贴之星
日期:2010-12-19 01:01:02数据库板块每日发贴之星
日期:2010-12-13 01:01:012009日食纪念
日期:2009-07-22 09:30:00优秀写手
日期:2014-02-08 06:00:12
95#
发表于 2012-2-8 23:53 | 只看该作者
本帖最后由 tree_new_bee 于 2012-2-9 00:32 编辑

采用上面的算法, 计算与OO相同的参数(每边不超过10000, 周长小于1e6), 时间只要2秒左右了。

with targ as (select 1e4 arg from dual)
, tp as(select level p from targ connect by level <=sqrt(arg))
,tq as(select level q from targ connect by level <=sqrt(arg))
, tabc as (select p*p a, p*q b, q*q c from tp, tq
where p<q and p+q > q*q/p
and pkg_prim2.gcd(p,q) = 1
)
,tmul as (select a*m a, b*m b, c*m c  from tabc, targ, (select level m from targ connect by level<=arg/4)
where (a+b+c)*m < 1e6
and a*m <= arg and b*m <= arg and c*m<=arg
)
select count(*) from tmul

  COUNT(*)
----------
      8341

Executed in 1.997 seconds

(代码只是为了保持与OO一致, 实际上有问题, p<q,遗漏了p=q的情况)
但应付题目中的参数,还远远不够。
与Q75一样, 性能问题不在于构造素Geometric triangles, 而在于后面的循环(tmul部分)。
SQL中无法对那个循环的界限细调, 还是要改用pl/sql来写, 明天继续。

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
96#
发表于 2012-2-9 00:10 | 只看该作者
本帖最后由 lastwinner 于 2012-2-9 00:10 编辑
tree_new_bee 发表于 2012-2-8 23:34
把上面的数,给出出a/b=b/c的最简化分数:
A        SQRT(A*C)        C        
4        6        9    ...

a/b挺有规律的
不过既然4 6 9满足题设
那么40 60 90也满足题设,不知你有否漏算?
TNB好久不见,不知过年可好?

使用道具 举报

回复
论坛徽章:
10
CTO参与奖
日期:2009-02-20 09:44:20ITPUB年度最佳技术原创精华奖
日期:2013-03-22 13:18:30迷宫蛋
日期:2012-05-07 10:55:58茶鸡蛋
日期:2012-04-19 16:08:262012新春纪念徽章
日期:2012-01-04 11:54:462011新春纪念徽章
日期:2011-01-04 10:24:02数据库板块每日发贴之星
日期:2010-12-19 01:01:02数据库板块每日发贴之星
日期:2010-12-13 01:01:012009日食纪念
日期:2009-07-22 09:30:00优秀写手
日期:2014-02-08 06:00:12
97#
发表于 2012-2-9 00:13 | 只看该作者
tree_new_bee 发表于 2012-2-8 23:34
把上面的数,给出出a/b=b/c的最简化分数:
A        SQRT(A*C)        C        
4        6        9    ...
  1. 就可以看到构造方法了: 取数对p,q, 使得gcd(p,q)=1, 且p<q<2p (证明: 因为p+q >q*q/p 且q>p, 所以pp+pq>qq, 所以2pq>qq, 所以2p>q)
  2. 然后,用p^2, p*q, q^2, 就可以构造出素Geometric triangles。
复制代码
证明:
因为 p^2 * q^2 = (p*q)^2, 所以构造的数一定是Geometric triangles
下面证明完备性:
设a,b,c是满足条件的素Geometric triangles, 即 a/b = b/c, 且gcd(a,b,c)=1
则假设a/b, b/c可化简为p/q, p和q互质
因为a/b = p/q, 所以存在m 使得a =mp b=mq
因为b/c = p/q, 所以存在n 使得b =np c=nq
所以 mq = np, 即m/n = p/q
因为p/q互质, 且a,b,c互质, 所以m,n互质
(如果m,n不互质, 则假设m=kp, n=kq,(k>1), 则a=kpp, b=kpq, c= kqq, a,b,c有共同的因子k, 与 a,b,c互质矛盾)
因此 m=p, n=q

所以a=mp=p*p, b=mq = p*q,  c= nq=q*q

也即素Geometric triangles一定能以p^2,p*q, q*q的方式来表示。

顺带证明了92#的结论:
  1. 可以看到a/c都是完全平方数。
  2. 证明方法暂时没想到。
复制代码






使用道具 举报

回复
论坛徽章:
10
CTO参与奖
日期:2009-02-20 09:44:20ITPUB年度最佳技术原创精华奖
日期:2013-03-22 13:18:30迷宫蛋
日期:2012-05-07 10:55:58茶鸡蛋
日期:2012-04-19 16:08:262012新春纪念徽章
日期:2012-01-04 11:54:462011新春纪念徽章
日期:2011-01-04 10:24:02数据库板块每日发贴之星
日期:2010-12-19 01:01:02数据库板块每日发贴之星
日期:2010-12-13 01:01:012009日食纪念
日期:2009-07-22 09:30:00优秀写手
日期:2014-02-08 06:00:12
98#
发表于 2012-2-9 00:15 | 只看该作者
lastwinner 发表于 2012-2-9 00:10
a/b挺有规律的
不过既然4 6 9满足题设
那么40 60 90也满足题设,不知你有否漏算?

呵呵,一切都好, 谢谢记挂!


上面的代码的tmul部分就是将素Geometric triangles循环乘以所有自然数的, 所以不会有遗漏。

同时因为是"素"的, 所以乘自然数后也不会有重复。

使用道具 举报

回复
论坛徽章:
10
CTO参与奖
日期:2009-02-20 09:44:20ITPUB年度最佳技术原创精华奖
日期:2013-03-22 13:18:30迷宫蛋
日期:2012-05-07 10:55:58茶鸡蛋
日期:2012-04-19 16:08:262012新春纪念徽章
日期:2012-01-04 11:54:462011新春纪念徽章
日期:2011-01-04 10:24:02数据库板块每日发贴之星
日期:2010-12-19 01:01:02数据库板块每日发贴之星
日期:2010-12-13 01:01:012009日食纪念
日期:2009-07-22 09:30:00优秀写手
日期:2014-02-08 06:00:12
99#
发表于 2012-2-9 00:30 | 只看该作者
上面的代码的问题:  有了素Geometric triangles后,其实没必要构造非素Geometric triangles, 只要算出总数就行了。
  1. with targ as (select 1e6 arg from dual)
  2. , tp as(select level p from targ connect by level <=sqrt(arg))
  3. ,tq as(select level q from targ connect by level <=sqrt(arg))
  4. , tabc as (select p*p a, p*q b, q*q c from tp, tq
  5. where p<=q and p+q > q*q/p
  6. and pkg_prim2.gcd(p,q) = 1
  7. )
  8. ,tmul as (select a,b,c,floor(arg/(a+b+c)) cnt   from tabc, targ
  9. )
  10. select sum(cnt) from tmul
复制代码
SUM(CNT)
----------
    861805

Executed in 2.621 seconds

这样,1e6的,用SQL就应付过去了。 至于2.5e13, 还是要想办法。

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
100#
发表于 2012-2-9 00:47 | 只看该作者
期待TNB出手。

使用道具 举报

回复

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

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表