楼主: 〇〇

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
51#
 楼主| 发表于 2012-1-14 17:03 | 只看该作者
本帖最后由 〇〇 于 2012-1-14 19:41 编辑
〇〇 发表于 2012-1-14 16:59
从前几个数来看,a必须是偶数,但不知道怎么证明
create or replace procedure q224b(n number default  ...


--其实b也必须是偶数

create or replace procedure q224c(n number default 1000)
as
TYPE t_row IS TABLE OF  BINARY_INTEGER;
T T_row:=t_row();
s1 number;
s2 number;
s3 number;
cnt number:=0;
begin
t.EXTEND(n);
for i in 1..n loop
t(i):=i*i;
end loop;
for l1 in 1..n/2.828 loop
s1:=t(l1*2); --l1*l1;
for l2 in l1..n/2 loop
s2:=t(l2*2); --l2*l2;

s3:=floor(sqrt(s1+s2))+1;
if s3>n then exit; end if;
if s1+s2=s3*s3-1 then
cnt:=cnt+1;
end if;
end loop;
end loop;

dbms_output.put_line(cnt);
end;
/
SQL> exec q224c
126

PL/SQL 过程已成功完成。

已用时间:  00: 00: 00.20
SQL> exec q224c(2000)
257

PL/SQL 过程已成功完成。

已用时间:  00: 00: 00.70
请数学大师帮我证明了
wayne

管理员

wayne 当前在线 威望342 星 金币3554 枚 贡献3579 分 经验4006 点 鲜花297 朵 魅力77 点 下载67 次 阅读权限255 在线时间1466 小时 注册时间2009-2-12 最后登录2012-1-14




管理员
帖子3278 精华5 积分14542 鲜花297 朵 主题141 帖
2#
发表于 半小时前 | 只看该作者    踩窝窝   送礼物   问候Ta





1# 〇〇
如果a,b一奇一偶,那么a^2+b^2被4除余1,于是c必须为偶数,但 c^2-1被4整除余3,矛盾,故不存在。
如果a,b均为奇数,那么a^2+b^2被8除余2,于是c必须为奇数,但 c^2-1被8整除,矛盾,故不存在。

故a,b均为偶数




使用道具 举报

回复
论坛徽章:
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
52#
 楼主| 发表于 2012-1-14 19:36 | 只看该作者
本帖最后由 〇〇 于 2012-1-14 19:56 编辑
〇〇 发表于 2012-1-14 17:03
--其实b也必须是偶数

create or replace procedure q224c(n number default 1000)


用整数和平方根相等判断代替乘法,快了一点
create or replace procedure q224d(n number default 1000)
as
TYPE t_row IS TABLE OF  BINARY_INTEGER;
T T_row:=t_row();
s1 number;
s2 number;
s3 number;
cnt number:=0;
begin
t.EXTEND(n);
for i in 1..n loop
t(i):=i*i;
end loop;
for l1 in 1..n/2.828 loop
s1:=t(l1*2); --l1*l1;
for l2 in l1..n/2 loop
s2:=t(l2*2); --l2*l2;
s3:=sqrt(s1+s2+1);
if s3>n then exit; end if;
if s3=floor(s3) then
cnt:=cnt+1;
end if;
end loop;
end loop;

dbms_output.put_line(cnt);
end;
/

SQL> exec q224d
126

PL/SQL 过程已成功完成。

已用时间:  00: 00: 00.20
SQL> exec q224d(2000)
257

PL/SQL 过程已成功完成。

已用时间:  00: 00: 00.60
SQL> exec q224d(4000)
502

PL/SQL 过程已成功完成。

已用时间:  00: 00: 02.40

但奇怪的事:加上数学分析,反而更慢了
因为当a固定时,对一个b,只能有一个c,那么下一个待尝试的第3边至少是c+1。而(c+1)^2=c^2+2c+1
所以下一个b^2和当前b^2的差至少2c+1,设下一个b=当前b+d,
(b+d)^2=b^2+2bd+d^2,
d^2+2bd>=2c+1解不等式d>=sqrt(b^2+2c+1)-b
跨度小于此数的b都是无效的尝试。所以:
当求出一个c以后,下一个b=ceil(sqrt(b^2+2c+1)

create or replace procedure q224e(n number default 1000)
as
TYPE t_row IS TABLE OF  BINARY_INTEGER;
T T_row:=t_row();
s1 number;
s2 number;
s3 number;
cnt number:=0;
l2 number;
begin
t.EXTEND(n);
for i in 1..n loop
t(i):=i*i;
end loop;
for l1 in 1..n/2.828 loop
s1:=t(l1*2); --l1*l1;
--for l2 in l1..n/2 loop
l2:=l1;
while l2<=n/2 loop
s2:=t(l2*2); --l2*l2;
s3:=sqrt(s1+s2+1);
if s3>n then exit; end if;
if s3=floor(s3) then
cnt:=cnt+1;
l2:=ceil(sqrt(s2+2*s3+1)/2);
else
l2:=l2+1;
end if;
end loop;
end loop;

dbms_output.put_line(cnt);
end;
/
SQL> exec q224e
126

PL/SQL 过程已成功完成。

已用时间:  00: 00: 00.20
SQL> exec q224e(2000)
257

PL/SQL 过程已成功完成。

已用时间:  00: 00: 00.80
SQL> exec q224e(4000)
502

PL/SQL 过程已成功完成。

已用时间:  00: 00: 03.00
SQL> exec q224e(8000)
996

PL/SQL 过程已成功完成。

已用时间:  00: 00: 11.70
SQL> exec q224d(8000)
996

PL/SQL 过程已成功完成。

已用时间:  00: 00: 09.40

好像是while loop比for loop慢,去掉了l2的赋值,还是差不多的时间


使用道具 举报

回复
论坛徽章:
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
53#
 楼主| 发表于 2012-1-14 20:57 | 只看该作者
根据51楼的结论,c必须是奇数,那么下一个c=c+2,平方的间隔是4c+4,但速度依旧很慢
create or replace procedure q224e(n number default 1000)
as
TYPE t_row IS TABLE OF  BINARY_INTEGER;
T T_row:=t_row();
s1 number;
s2 number;
s3 number;
cnt number:=0;
l2 number;
begin
t.EXTEND(n);
for i in 1..n loop
t(i):=i*i;
end loop;
for l1 in 1..n/2.828 loop
s1:=t(l1*2); --l1*l1;
--for l2 in l1..n/2 loop
l2:=l1;
while l2<=n/2 loop
s2:=t(l2*2); --l2*l2;
s3:=sqrt(s1+s2+1);
if s3>n then exit; end if;
if s3=floor(s3) then
cnt:=cnt+1;
l2:=ceil(sqrt(s2+4*s3+4)/2);
else
l2:=l2+1;
end if;
end loop;
end loop;

dbms_output.put_line(cnt);
end;
/

SQL> exec q224e(4000)
502

PL/SQL 过程已成功完成。

已用时间:  00: 00: 03.00
SQL> exec q224e(8000)
996

PL/SQL 过程已成功完成。

已用时间:  00: 00: 11.07

使用道具 举报

回复
论坛徽章:
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
54#
 楼主| 发表于 2012-1-15 07:01 | 只看该作者
〇〇 发表于 2012-1-14 20:57
根据51楼的结论,c必须是奇数,那么下一个c=c+2,平方的间隔是4c+4,但速度依旧很慢
create or replace proc ...

从a入手,随着b的增加,(b+1)^2-b^2=2b+1越来越大,如果a^2+1不足2b+1,那么后面的b都无效
因此b的上限是a^2/2

create or replace procedure q224f(n number default 1000)
as
TYPE t_row IS TABLE OF  BINARY_INTEGER;
T T_row:=t_row();
s1 number;
s2 number;
s3 number;
cnt number:=0;
l2 number;
u number;
begin
t.EXTEND(n);
for i in 1..n loop
t(i):=i*i;
end loop;
for l1 in 1..n/2.828 loop
s1:=t(l1*2); --l1*l1;
--for l2 in l1..n/2 loop
l2:=l1;
u:=case when s1/4<n/2 then s1/4 else n/2 end;
while l2<=u loop
s2:=t(l2*2); --l2*l2;
s3:=sqrt(s1+s2+1);
if s3>n then exit; end if;
if s3=floor(s3) then
cnt:=cnt+1;
l2:=ceil(sqrt(s2+4*s3+4)/2);
else
l2:=l2+1;
end if;
end loop;
end loop;

dbms_output.put_line(cnt);
end;
/
SQL> exec q224f(4000)
502

PL/SQL 过程已成功完成。

已用时间:  00: 00: 02.05
SQL> exec q224f(8000)
996

PL/SQL 过程已成功完成。

已用时间:  00: 00: 09.08
SQL> exec q224d(8000)
996

PL/SQL 过程已成功完成。

已用时间:  00: 00: 09.02

使用道具 举报

回复
论坛徽章:
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
55#
 楼主| 发表于 2012-1-15 07:14 | 只看该作者
Problem 367
14 January 2012


Bozo sort, not to be confused with the slightly less efficient bogo sort, consists out of checking if the input sequence is sorted and if not swapping randomly two elements. This is repeated until eventually the sequence is sorted.

If we consider all permutations of the first 4 natural numbers as input the expectation value of the number of swaps, averaged over all 4! input sequences is 24.75.
The already sorted sequence takes 0 steps.

In this problem we consider the following variant on bozo sort.
If the sequence is not in order we pick three elements at random and shuffle these three elements randomly.
All 3!=6 permutations of those three elements are equally likely.
The already sorted sequence will take 0 steps.
If we consider all permutations of the first 4 natural numbers as input the expectation value of the number of shuffles, averaged over all 4! input sequences is 27.5.
Consider as input sequences the permutations of the first 11 natural numbers.
Averaged over all 11! input sequences, what is the expected number of shuffles this sorting algorithm will perform?

Give your answer rounded to the nearest integer.


使用道具 举报

回复
论坛徽章:
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
56#
 楼主| 发表于 2012-1-15 18:59 | 只看该作者
p 224论坛上的解释
a = 2u, b = 2v, and c = 2w + 1,
u^2 + v^2 = w(w+1)

both w and (w+1) can be written as sum of 2 squares

ie. if w can be written as (m^2+n^2) and (w+1) as (p^2+q^2),
then w(w+1) can be written as (mp+nq)^2+(mq-np)^2 or (mp-nq)^2 + (mq+np)^2

0 <= m, n, p, q and 1 <= w

使用道具 举报

回复
论坛徽章:
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
57#
发表于 2012-1-16 22:30 | 只看该作者
224  最终解决了吗?哪个版本?我看你最多运行了N=8000.
这种规则很少、范围很大的题比较难下手。

使用道具 举报

回复
论坛徽章:
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
58#
 楼主| 发表于 2012-1-16 22:43 | 只看该作者
newkid 发表于 2012-1-16 22:30
224  最终解决了吗?哪个版本?我看你最多运行了N=8000.
这种规则很少、范围很大的题比较难下手。

我还没有,通过网上搜来的答案进去论坛看了思路,有个作者就是56楼的算法,据说是17秒
附件中的224.cpp只要几毫秒,我用存储过程思路改写的c程序几万就扛不住了,还是算法重要。。。
224_cpp.rar (978 Bytes, 下载次数: 6)

使用道具 举报

回复
论坛徽章:
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
59#
发表于 2012-1-16 22:51 | 只看该作者
233,  考察1/8段的圆弧,把两个端点连起来,外面再做一条平行的切线,就算这条线之间的点。再不行可能得用微积分吧。
367看不懂,不知道例子中的27.5是怎么算来的。

使用道具 举报

回复
论坛徽章:
548
生肖徽章2007版:猴
日期:2008-05-16 11:28:59生肖徽章2007版:马
日期:2008-10-08 17:01:01SQL大赛参与纪念
日期:2011-04-13 12:08:17授权会员
日期:2011-06-17 16:14:53ITPUB元老
日期:2011-06-21 11:47:01ITPUB官方微博粉丝徽章
日期:2011-07-01 09:45:27ITPUB十周年纪念徽章
日期:2011-09-27 16:30:472012新春纪念徽章
日期:2012-01-04 11:51:222012新春纪念徽章
日期:2020-11-30 22:13:24海蓝宝石
日期:2012-02-20 19:24:27
60#
发表于 2012-1-18 09:42 | 只看该作者
〇〇 发表于 2012-1-8 21:40
1、10^16里,找出所有的素数
不现实 http://tieba.baidu.com/f?kz=817417199

呵呵,这个里面的那个NB的人也推荐别人看看《素数之恋》(这本真的很精彩,黎曼假设。。。)

使用道具 举报

回复

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

本版积分规则 发表回复

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