|
tree_new_bee 发表于 2011-1-13 22:20 ![]()
题目看起来很简单, 要是小一点的上界, 怎么都好做。
但1500000实在是个恐怖的数字。 题目看起来很简单, 要是小一点的上界, 怎么都好做。
但1500000实在是个恐怖的数字。
用wiki里这个公式:
a = m2 − n2,
b = 2mn,
c = m2 + n2
其中m,n互质, 可以产生素勾股数
要产生所有勾股数, 只要在上面的基础上乘上自然数k就行。
问题是, 前一步的素勾股数可以很快产生, 所有的素勾股数*k,这一步也很慢。
这里引用错误。 m,n除了互质外,还要保证两个奇偶不同。
按照这个思路,用SQL来写:
- with targ as (select 150000 arg from dual)
- ,tmn as (select level d from targ connect by level<=sqrt(arg/2))
- , tp as (select tm.d m, tn.d n, least((tm.d*tm.d - tn.d*tn.d),(2*tm.d*tn.d)) a, greatest((tm.d*tm.d - tn.d*tn.d),(2*tm.d*tn.d)) b, (tm.d*tm.d + tn.d*tn.d) c
- ,(tm.d*tm.d *2 + 2*tm.d*tn.d ) p
- from tmn tm, tmn tn, targ
- where tm.d>tn.d
- and (tm.d*tm.d *2 + 2*tm.d*tn.d ) <arg
- and pkg_prim2.gcd(tm.d, tn.d) = 1
- and mod(tm.d+tn.d,2) = 1
- )
- , tmul as (select a*k a, b*k b, c*k c, p*k p
- from tp, targ ,(select level k from targ connect by level<=arg/12) tk
- where k <= arg/p)
- ,tgroup as (select p, count(*) from tmul group by p having count(*) = 1)
- select count(*) from tgroup
-
- COUNT(*)
- ----------
- 16414
复制代码
只是算到150000,就已经要100多秒了。 受不了。
|
|