Project Euler 171
@see http://projecteuler.net/index.php?section=problems&id=171
♥0 |
Line 52 |
Modified 2010-02-07 13:03:28 |
MIT License
archived:2017-03-10 02:39:51
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/si6M
*/
package {
import flash.display.Sprite;
import flash.text.TextField;
import flash.utils.getTimer;
// @see http://projecteuler.net/index.php?section=problems&id=171
public class Euler171 extends Sprite {
private var _tf : TextField;
public function Euler171() {
_tf = new TextField();
_tf.width = 465;
_tf.height = 465;
addChild(_tf);
var s : int = getTimer();
tr(solve(20));
var g : int = getTimer();
tr((g - s) + " ms");
}
// 下の桁から二乗和のテーブルを足していく。
// 和を求めるため、個数テーブルも途中まで必要。
private function solve(N : uint) : Number
{
var a : Array = new Array(81 * N + 1);
var i : uint, j : uint, k : Number, l : uint;
// index:二乗和, [0]:個数, [1]:和
for(i = 0;i < a.length;i++)a[i] = [0, 0];
a[0] = [1, 0];
for(j = 0, k = 1;j < N;j++, k*=10){
var n : Array = new Array(81 * N + 1);
for(i = 0;i < n.length;i++)n[i] = [0, 0];
for(i = 0;i <= 81 * j;i++){
for(l = 0;l <= 9;l++){
if(k > 1E9){
n[i+l*l][1] += a[i][1];
}else{
n[i+l*l][0] += a[i][0];
n[i+l*l][1] += a[i][1] + ((l * k * a[i][0]) % 1E9);
}
n[i+l*l][1] %= 1E9;
}
}
a = n;
}
// 二乗和が平方数になるやつだけ足す
var sum : uint = 0;
for(i = 0;i * i <= 81 * N;i++){
sum += a[i*i][1];
sum %= 1E9;
}
return sum;
}
private function tr(...o : Array) : void
{
_tf.appendText(o + "\n");
_tf.scrollV = _tf.maxScrollV;
}
}
}