Right triangles with integer coordinates

The points P (x1, y1) and Q (x2, y2) are plotted at integer co-ordinates and are joined to the origin, O(0,0), to form ΔOPQ.

There are exactly fourteen triangles containing a right angle that can be formed when each co-ordinate lies between 0 and 2 inclusive; that is,0 ≤ x1, y1, x2, y2 ≤ 2.

Given that 0 ≤ x1, y1, x2, y2 ≤ 50, how many right triangles can be formed?


格点直角三角形

点P(x1, y1)和点Q(x2, y2)都是格点,并与原点O(0,0)构成ΔOPQ。

当点P和点Q的所有坐标都在0到2之间,也就是说0 ≤ x1, y1, x2, y2 ≤ 2时,恰好能构造出14个直角三角形。

如果0 ≤ x1, y1, x2, y2 ≤ 50,能构造出多少个直角三角形?

 解题

先网上找到的答案,然后看题解中,前面几题给出了暴露的方法,遍历所有的点 ,判断是否是直角三角形就好了,最后的结果要除以2,,因为两个点是可以互换的。

Java

package Level3;

public class PE091{
static void run(){
int N = 50;
int count = 0;
// 第一个顶点
for(int x1 = 0; x1<=N;x1++){
for(int y1 = 0;y1<=N ;y1++){
if(x1==0 && y1==0) continue;
// 第二个顶点
for(int x2 = 0;x2<=N;x2++){
for(int y2=0;y2<=N;y2++){
if(x2==0&&y2==0 || x1==x2&&y1==y2)
continue;
//判断是否是三角形
double d1 = getDistance(0,0,x1,y1);
double d2 = getDistance(0,0,x2,y2);
double d3 = getDistance(x1,y1,x2,y2);
if(d1+d2==d3|| d1+d3==d2||d2+d3==d1)
count++;
}
}
}
}
System.out.println(count/2);
}
// 14234
// running time=0s71ms
static double getDistance(int x1,int y1,int x2,int y2){
double d1 = (x1-x2)*(x1-x2);
double d2 = (y1-y2)*(y1-y2);
return d1+d2;
} public static void main(String[] args) {
long t0 = System.currentTimeMillis();
run();
long t1 = System.currentTimeMillis();
long t = t1 - t0;
System.out.println("running time="+t/1000+"s"+t%1000+"ms"); }
}

参考链接1  参考链接2

上面给出来很好的不用暴力的方法

对于直角在原点的情况:

P Q两点只能在x轴  y轴上,固定一点看另一点,显然有50中可能,然而这一点也有50种可能,共2500种

对于直角在x轴或者y轴的情况:

当P 在x轴上的某点时候,Q的x坐标显然要和P 的一样,PQ都各有50个位置,共2500种

当P 在y轴的时候,也有2500种

对于直角在方格内部的时候:

要使得是直角三角形:OP要垂直PQ

OP的斜率:k = dy/dx  (dy/dx是最简分数)    其中P的坐标设为(x,y)

则PQ的斜率是:-dx/dy

如何根据斜率,找到Q的整数点,或者Q点的个数。

当P点的y轴值>Q点的y轴的值时候:

(如上图所示)可以发现:Q1 Q2 把PQ3等分成三份。三个Q点都是整数点。

对斜率为k = dy/dx :可以通过一个dy * dx的方格表示出来,所以,对于P(x,y)点,x每加一个dx y每减一个dy都是一个整数Q点,那么有多少个符合要求的点?只需要看最大能走多少步,

对于PQ的斜率是dx/dy,当P(x,y),   对x而言最大的步数是:(N-x)/dy ,对y而言最大的步数是:y/dx

这样其最小值就是Q的整数点数:MIN((N-x)/dy,y/dx)

当P点的y轴值<Q点的y轴的值时候:


PQ的斜率是:-dx/dy

P(x,y) x向左走的最大步数:x/dy y向上走的最大步数:(N-y)/dx

这样其最小值就是Q的整数点数:MIN(x/dy,(N-y)/dx)

这与上面链接的结果不一样,根据运行结果发现答案是一样的

其实吧 对于P点的坐标可以是在N*N方格中的任意一点,P的坐标是可以对称的,所以可以直接乘以二的。

JAVA

package Level3;

public class PE091{
static void run1(){
int N = 50;
// 直角在原点,直角在x轴 直角在y轴,个数都是N*N
int result =N*N*3;
//下面只需要对直角在方格内部的情况
for(int x = 1;x<= N;x++){
for(int y=1;y<= N;y++){
int fact = gcd(x,y);
result += Math.min(y*fact/x, (N-x)*fact/y);
result += Math.min(x*fact/y, (N-y)*fact/x);
}
}
System.out.println(result);
}
// 14234
// running time=0s78ms
static int gcd(int x,int y){
if(x<y){
int tmp = x;
x = y;
y = tmp;
}
int r = x%y;
while(r!=0){
int tmp =x;
x = y;
y = tmp%x;
r = x%y;
}
return y;
}
static void run(){
int N = 50;
int count = 0;
// 第一个顶点
for(int x1 = 0; x1<=N;x1++){
for(int y1 = 0;y1<=N ;y1++){
if(x1==0 && y1==0) continue;
// 第二个顶点
for(int x2 = 0;x2<=N;x2++){
for(int y2=0;y2<=N;y2++){
if(x2==0&&y2==0 || x1==x2&&y1==y2)
continue;
//判断是否是三角形
double d1 = getDistance(0,0,x1,y1);
double d2 = getDistance(0,0,x2,y2);
double d3 = getDistance(x1,y1,x2,y2);
if(d1+d2==d3|| d1+d3==d2||d2+d3==d1)
count++;
}
}
}
}
System.out.println(count/2);
}
// 14234
// running time=0s71ms
static double getDistance(int x1,int y1,int x2,int y2){
double d1 = (x1-x2)*(x1-x2);
double d2 = (y1-y2)*(y1-y2);
return d1+d2;
} public static void main(String[] args) {
long t0 = System.currentTimeMillis();
run();
long t1 = System.currentTimeMillis();
long t = t1 - t0;
System.out.println("running time="+t/1000+"s"+t%1000+"ms"); }
}

Python

# coding=gbk

import time as time
from itertools import combinations
def run():
N = 50
count = N*N*3
for x in range(1,N+1):
for y in range(1,N+1):
fact = gcd(x,y)
count += min((N-x)*fact/y,y*fact/x)*2
print count #
# running time= 0.00300002098083 s
def gcd(x,y):
if x<y:
x,y = y,x
while x%y!=0:
tmp = x
x = y
y = tmp%y
return y t0 = time.time()
run()
t1 = time.time()
print "running time=",(t1-t0),"s"

Project Euler 91:Right triangles with integer coordinates 格点直角三角形的更多相关文章

  1. [project euler] program 4

    上一次接触 project euler 还是2011年的事情,做了前三道题,后来被第四题卡住了,前面几题的代码也没有保留下来. 今天试着暴力破解了一下,代码如下: (我大概是第 172,719 个解出 ...

  2. Project Euler 44: Find the smallest pair of pentagonal numbers whose sum and difference is pentagonal.

    In Problem 42 we dealt with triangular problems, in Problem 44 of Project Euler we deal with pentago ...

  3. Python练习题 039:Project Euler 011:网格中4个数字的最大乘积

    本题来自 Project Euler 第11题:https://projecteuler.net/problem=11 # Project Euler: Problem 10: Largest pro ...

  4. Python练习题 032:Project Euler 004:最大的回文积

    本题来自 Project Euler 第4题:https://projecteuler.net/problem=4 # Project Euler: Problem 4: Largest palind ...

  5. Python练习题 029:Project Euler 001:3和5的倍数

    开始做 Project Euler 的练习题.网站上总共有565题,真是个大题库啊! # Project Euler, Problem 1: Multiples of 3 and 5 # If we ...

  6. Project Euler 9

    题意:三个正整数a + b + c = 1000,a*a + b*b = c*c.求a*b*c. 解法:可以暴力枚举,但是也有数学方法. 首先,a,b,c中肯定有至少一个为偶数,否则和不可能为以上两个 ...

  7. project euler 169

    project euler 169 题目链接:https://projecteuler.net/problem=169 参考题解:http://tieba.baidu.com/p/2738022069 ...

  8. 【Project Euler 8】Largest product in a series

    题目要求是: The four adjacent digits in the 1000-digit number that have the greatest product are 9 × 9 × ...

  9. Project Euler 第一题效率分析

    Project Euler: 欧拉计划是一系列挑战数学或者计算机编程问题,解决这些问题需要的不仅仅是数学功底. 启动这一项目的目的在于,为乐于探索的人提供一个钻研其他领域并且学习新知识的平台,将这一平 ...

随机推荐

  1. hover和mouseover,mouseout的区别

    说道hover和mouseover,mouseout的区别,不得不联系到mouseenter,mouseleave. mouseover,mouseout是指鼠标指针在穿过/离开被选元素或其子元素时触 ...

  2. Jquery显示和隐藏的4种简单方法

    Html代码:  <div class="topicList">  <h3><span>学习天地</span></h3> ...

  3. js学习笔记一-语法结构

    js是区分大小写的,关键字.变量.函数名和所有的标识符都必须采取统一一致的大小写形式. js定义了unicode转义序列,以\u开头,其后跟随四个十六进制数,可以在字符串直接量.正则表达式直接量和标识 ...

  4. DataSnap如何监控Tcp/IP客户端的连接情况

    一个实例,如果客户端是TCP/IP是短连接的情况就没有必要了. 一.GlobVar.pas单元,定义应用系统全局数据类型及变量: unit GlobVar; interface uses System ...

  5. How to enables AX email functionality without Outlook

    /***************************************************************** (C) Copyright DENTSPLY Internatio ...

  6. C string 函数大全

    PS:本文包含了大部分strings函数的说明,并附带举例说明.本来想自己整理一下的,发现已经有前辈整理过了,就转了过来.修改了原文一些源码的问题,主要是用char *字义字符串的问题,导致程序运行时 ...

  7. XSS获取cookie

    在你服务器的html目录下创建joke文件夹: 在joke文件夹中创建joke.js 和joke.php joke.js 创建img标签,将它的src属性指向另一个脚本joke.php,这里关键的一点 ...

  8. http 4中 cache 头

    // head['Cache-Control']='max-age=31536000'; // head['Expires']=new Date((new Date().getTime()+99999 ...

  9. Notes of the scrum meeting(2013/10/23)

    ps:本来是10月23号周三下午开的会,这几天由于各种事情忙,忘记写博客了,现在补上. 软工项目组buaa_smile开始项目第一次scrum meeting meeting time:4:00~5: ...

  10. OpenWrt固件刷入后串口终端没有反应的问题

    [路由器开发板硬件固件配置] MTK双频:MT7620a + MT7612e 内存:256 MB 闪存:16 MB 固件:MTK自带SDK中的OpenWrt固件(mtksdk-openwrt-2.6. ...