Project Euler 250

by uwi
@see http://projecteuler.net/index.php?section=problems&id=250
♥0 | Line 45 | Modified 2009-06-18 21:15:05 | 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/vkdx
 */

package {
    import flash.display.Sprite;
    import flash.text.TextField;
    import flash.utils.getTimer;
    // @see http://projecteuler.net/index.php?section=problems&id=250
    public class Euler250 extends Sprite {
        private var _tf : TextField;
  
        // めっさおもいです!!!!
        public function Euler250() {
            _tf = new TextField();
            _tf.width = 465;
            _tf.height = 465;
            addChild(_tf);
            
            var s : int = getTimer();
            _tf.appendText(solve().toString() + "\n");
            var g : int = getTimer();
            _tf.appendText((g - s).toString() + " ms\n");
        }
        
        private function solve() : Number
        {
            var i : int, j : int, v : uint;
            
            var m250 : Vector.<uint> = new Vector.<uint>();
            for(i = 1;i <= 250250;i++){
                // i ^ i % 250
                var ii : uint = i % 250;
                v = 1;
                for(j = i;j > 0;j >>= 1){
                    if((j & 1) == 1)v = (v * ii) % 250;
                    ii = (ii * ii) % 250;
                }
                m250.push(v);
            }
            
            var c250 : Array = [1];
            for(i = 1;i <= 249;i++)c250.push(0);
            var newc250 : Array;
            
            for each(var m : int in m250){
                // simulate
                newc250 = c250.concat();
                for(i = 0;i <= 249;i++){
                    newc250[(i + m) % 250] += c250[i];
                }
                
                for(i = 0;i <= 249;i++){
                    c250[i] = newc250[i] % 10000000000000000;
                }
            }
            
            return c250[0] - 1; // -1 : empty subset
        }
    }
}