/**
* Copyright uwi ( http://wonderfl.net/user/uwi )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/cXKN
*/
package {
import flash.display.Sprite;
import flash.text.TextField;
import flash.utils.getTimer;
// @see http://projecteuler.net/index.php?section=problems&id=195
public class Euler195 extends Sprite {
private var _tf : TextField;
public function Euler195() {
_tf = new TextField();
_tf.width = 465;
_tf.height = 465;
addChild(_tf);
var s : int = getTimer();
tr(solve(100));
// tr(solveNaive(10));
var g : int = getTimer();
tr((g - s) + " ms");
}
private function solve(N : uint) : Number
{
this.N = N;
_ct = 0;
// sbrec(0, 1, 1, 2);
var q : Array = [[0, 1, 1, 2]];
while(q.length > 0){
var param : Array = q.pop();
var sn : uint = param[0];
var sd : uint = param[1];
var en : uint = param[2];
var ed : uint = param[3];
var mn : uint = sn + en;
var md : uint = sd + ed;
var xx : Number = N / ((md - 2 * mn) * (md + mn) * Math.sqrt(3) / 6);
if(xx >= 1 / 3){
var a : uint = md * (md - 2 * mn);
var b : uint = md * md - mn * mn;
var c : uint = md * md - mn * md + mn * mn;
if((mn + md) % 3 != 0){
// tr(mn, md, a, b, c);
_ct += int(xx);
}else{
// tr(mn, md, a/3, b/3, c/3, "/3");
_ct += int(xx * 3);
}
q.push([sn, sd, mn, md]);
q.push([mn, md, en, ed]);
}
}
return _ct;
}
public var N : Number;
private var _ct : uint;
private function sbrec(sn : uint, sd : uint, en : uint, ed : uint) : void
{
var mn : uint = sn + en;
var md : uint = sd + ed;
var xx : Number = N / ((md - 2 * mn) * (md + mn) * Math.sqrt(3) / 6);
if(xx >= 1 / 3){
var a : uint = md * (md - 2 * mn);
var b : uint = md * md - mn * mn;
var c : uint = md * md - mn * md + mn * mn;
if((mn + md) % 3 != 0){
// tr(mn, md, a, b, c);
_ct += int(xx);
}else{
// tr(mn, md, a/3, b/3, c/3, "/3");
_ct += int(xx * 3);
}
sbrec(sn, sd, mn, md);
sbrec(mn, md, en, ed);
}
}
/*
private function sbrec2(sn : uint, sd : uint, en : uint, ed : uint) : void
{
var mn : uint = sn + en;
var md : uint = sd + ed;
var xx : Number = N / ((2 * mn - md) * (md - mn) * Math.sqrt(3) / 2);
if(xx >= 1){
var a : uint = md * (2 * mn - md);
var b : uint = md * md - mn * mn;
var c : uint = md * md - mn * md + mn * mn;
// tr(mn, md, a, b, c);
if((mn + md) % 3 != 0){
// tr(mn, md, a, b, c, mn * (md - mn) * Math.sqrt(3) / 2);
tr(mn, md, a, b, c);
_ct += int(xx);
}else{
tr(mn, md, a/3, b/3, c/3, "/3");
// tr(mn, md, a/3, b/3, c/3, mn * (md - mn) / 3 * Math.sqrt(3) / 2, "ooo");
_ct += int(xx * 3);
}
sbrec2(sn, sd, mn, md);
sbrec2(mn, md, en, ed);
}
}
*/
private function solveNaive(N : uint) : uint
{
var ct : uint = 0;
for(var a : uint = 1;a <= 3000;a++){
for(var b : uint = a + 1;b <= 3000;b++){
var cn : Number = Math.sqrt(a * a + b * b - a * b);
if(int(cn) == cn){
var c : uint = cn;
var S : Number = a * b * Math.sqrt(3) / 2 / (a + b + c);
if(S <= N){
tr(a, b, c);
ct++;
}
// ct++;
}
}
}
return ct;
}
private function tr(...o : Array) : void
{
_tf.appendText(o + "\n");
_tf.scrollV = _tf.maxScrollV;
}
}
}