Project Euler 148

by uwi
@see http://projecteuler.net/index.php?section=problems&id=148
♥0 | Line 36 | Modified 2009-07-27 07:24:38 | MIT License
play

ActionScript3 source code

/**
 * Copyright uwi ( http://wonderfl.net/user/uwi )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/d0ld
 */

package {
    import flash.display.Sprite;
    import flash.text.TextField;
    import flash.utils.getTimer;
    // @see http://projecteuler.net/index.php?section=problems&id=148
    public class Euler148 extends Sprite {
        private var _tf : TextField;
  
        public function Euler148() {
            _tf = new TextField();
            _tf.width = 465;
            _tf.height = 465;
            addChild(_tf);
            
            var s : int = getTimer();
            t(solve(1000000000));
            var g : int = getTimer();
            t((g - s) + " ms");
        }

        // パスカルの三角形を左詰めで書くと、
        // C(n,k)の分子分母で7の倍数の個数の差がない(n,k)は、
        // 左下隅を直角とする7*7の直角二等辺三角形の周と内部を並べた図形になる。
        // 同様に7^nの倍数については、7^n*7^nの直角二等辺三角形を並べた図形になる。
        // 求める個数は、すべてのnについての図形の共通部分の要素の個数となる。
        //
        // Mを7進数で表す。ここからは説明しづらいので大まかに
        // 一番上の桁(k桁目)は、M行目までに関わる図形のなかで一番大きい図形のことを表す。
        // その個数は、桁の値をdとすると、28^k*d(d+1)/2で表せる。
        // 次の桁を見るとき、
        // 語弊があるが、一番大きい図形を構成している単位二等辺三角形のあまりの部分を表している。
        // 2番目に大きい図形は、d+1個あるので、
        // 桁の値をeとすると、28^(k-1)*e(e+1)/2*(d+1)
        // 3番目からも同様に計算していって、
        // (3番目のときの図形の個数は(d+1)(e+1)個)
        // 上記の式をすべて足したものが答え。
        private function solve(M : Number) : Number
        {
            var i : Number;
            var d7 : Array = [];
            for(i = M;i > 0;i = Math.floor(i / 7))d7.push(i % 7);
            
            var ct : Number = 0;
            var mul : Number = 1;
            for(i = d7.length - 1;i >= 0;i--){
                ct += Math.pow(28, i) * d7[i] * (d7[i] + 1) / 2 * mul;
                mul *= (d7[i] + 1);
            }
            
            t(d7);
            return ct;
        }

	private function t(o : *) : void
	{
            _tf.appendText("" + o + "\n");
	}
    }
}