// Please run with node.js
// $ node p1.js < input.txt
// tested on node version 0.10.36
var fs = require("fs");
var input = fs.readFileSync('/dev/stdin').toString();
var numbers = input.split("\n").map(Number);
numbers = numbers.sort(function(a, b) { return b - a });
for(var i = 0; i < 3; i++) {
    if(i < numbers.length) {
        console.log(numbers[i]);
    }
}

Global OOD problem IDs are disjoint from train, validation, and in-distribution test problem IDs.

List of Top 3 Hills

There is a data which provides heights (in meter) of mountains. The data is only for ten mountains.

Write a program which prints heights of the top three mountains in descending order.

Input

Height of mountain 1
Height of mountain 2
Height of mountain 3
.
.
Height of mountain 10

Constraints

0 ≤ height of mountain (integer) ≤ 10,000

Output

Height of the 1st mountain
Height of the 2nd mountain
Height of the 3rd mountain

Sample Input 1

1819
2003
876
2840
1723
1673
3776
2848
1592
922

Output for the Sample Input 1

3776
2848
2840

Sample Input 2

100
200
300
400
500
600
700
800
900
900

Output for the Sample Input 2

900
900
800

Submitted source-code file size, in bytes.

Execution CPU time reported by official Project CodeNet metadata, in milliseconds.

Peak memory usage reported by official Project CodeNet metadata, in kilobytes.


(function(stdin) {
  var mountains = stdin.trim().split('\n').map(Number);
  mountains.sort(function(a, b) {
    return b - a;
  });
  console.log(mountains.slice(0, 3).join('\n'));
})(require('fs').readFileSync('/dev/stdin', 'utf8'));


let sample_input = require('fs').readFileSync('/dev/stdin', 'utf8');

var hills = (sample_input.trim()).split("\n").map(Number);
hills.sort(function(a,b){return b-a;});
console.log(hills.slice(0,3).join("\n"));


var input = ''

process.stdin.resume()
process.stdin.setEncoding('utf8')
process.stdin.on('data', function(chunk) {
  input += chunk
})
process.stdin.on('end', function() {
  input = input.split('\n')
  main()
})

function main() {
    for(i=0; i<input.length; i++) {
     input_line = input[i].split(' ')
     sum = Number(input_line[0])+Number(input_line[1])
     console.log(String(sum).length);
    }
}

Digit Number

Write a program which computes the digit number of sum of two integers a and b.

Input

There are several test cases. Each test case consists of two non-negative integers a and b which are separeted by a space in a line. The input terminates with EOF.

Constraints

0 ≤ a, b ≤ 1,000,000

The number of datasets ≤ 200

Output

Print the number of digits of a + b for each data set.

Sample Input

5 7
1 99
1000 999

Output for the Sample Input

2
3
4


function caculateNumber(a, b) {
  var sumNumber;
  sumNumber = (a + b).toString();
  var i = 0;
  while (typeof sumNumber[i] != 'undefined') {
    i++;
  }
  return console.log(i);
};
caculateNumber(1, 99);


function getlength(num1,num2) {
    var num=num1+num2;
    var n1=num.toString().length;
    return n1;
}
var input = require('fs').readFileSync('/dev/stdin', 'utf8');
console.log(getlength(Number(input[0]),Number(input[1])));


Is it a Right Triangle?

Write a program which judges wheather given length of three side form a right triangle. Print "YES" if the given sides (integers) form a right triangle, "NO" if not so.

Input

Input consists of several data sets. In the first line, the number of data set, N is given. Then, N lines follow, each line corresponds to a data set. A data set consists of three integers separated by a single space.

Constraints

1 ≤ length of the side ≤ 1,000

N ≤ 1,000

Output

For each data set, print "YES" or "NO".

Sample Input

3
4 3 5
4 3 6
8 8 8

Output for the Sample Input

YES
NO
NO


// 標準入力
var fs = require('fs'),
length = fs.fstatSync(process.stdin.fd).size,
buffer = new Buffer(length),
bytesRead = fs.readSync(process.stdin.fd, buffer, 0, length, 0),
input = buffer.toString('utf8', 0, bytesRead).split('\n');
main();

// ここから
function main(){
  for(var line = 1, maxLines = input[0] - 0; line <= maxLines; line++){
    var inputArray = new Int32Array(input[line].split(" ").sort());
    var longest = inputArray[2];
    var middle = inputArray[1];
    var shortest = inputArray[0];

    console.log((longest*longest == middle*middle + shortest*shortest) ? 'YES' : 'NO');
  }
}


var input = require('fs').readFileSync('/dev/stdin', 'utf8');
var splitString = input.split(' ');
var reverseArray = splitString.reverse();
var joinArray = reverseArray.join(' ');
console.log(joinArray);

Reverse Sequence

Write a program which reverses a given string str.

Input

str (the size of str ≤ 20) is given in a line.

Output

Print the reversed str in a line.

Sample Input

w32nimda

Output for the Sample Input

admin23w


var debt = 100;
var wk = ~~(require('fs').readFileSync('/dev/stdin', 'utf8'));
for(; wk--;){
  debt = Math.ceil(debt * 1.05);
}
console.log(debt * 1000);

Debt Hell

Your friend who lives in undisclosed country is involved in debt. He is borrowing 100,000-yen from a loan shark. The loan shark adds 5% interest of the debt and rounds it to the nearest 1,000 above week by week.

Write a program which computes the amount of the debt in n weeks.

Input

An integer n (0 ≤ n ≤ 100) is given in a line.

Output

Print the amout of the debt in a line.

Sample Input

5

Output for the Sample Input

130000


// 標準入力
var fs = require('fs'),
length = fs.fstatSync(process.stdin.fd).size,
buffer = new Buffer(length),
bytesRead = fs.readSync(process.stdin.fd, buffer, 0, length, 0),
input = buffer.toString('utf8', 0, bytesRead).trim().split('\n');
main();

// ここから
function main(){
  var primeNumbers = calcPrimeNumbers();
  for(var i = 0, len = input.length; i < len; i++){
    console.log(primeNumbers[parseInt(input[i], 10)]);
  }
}

function calcPrimeNumbers(){
  var max = 999999;
  var primeNumbers = new Int8Array(max + 1);

  // 除外
  primeNumbers[0] = primeNumbers[1] = 1;
  // for(var i = 2, maxI = ~~Math.sqrt(max); i <= maxI; i++){
  for(var i = 2; i <= 1000; i++){
  if(primeNumbers[i]){
      continue;
    }

    for(var j = (i<<1); j <= max; j+=i){
      primeNumbers[j] = 1;
    }
  }

  var primeNums = new Int32Array(max + 1);
   for(var i = 1; i <= max; i++){
    primeNums[i] += primeNums[i-1] + 1 - primeNumbers[i];
  }

  return primeNums;
}

Prime Number

Write a program which reads an integer n and prints the number of prime numbers which are less than or equal to n. A prime number is a natural number which has exactly two distinct natural number divisors: 1 and itself. For example, the first four prime numbers are: 2, 3, 5 and 7.

Input

Input consists of several datasets. Each dataset has an integer n (1 ≤ n ≤ 999,999) in a line.

The number of datasets is less than or equal to 30.

Output

For each dataset, prints the number of prime numbers.

Sample Input

10
3
11

Output for the Sample Input

4
2
5


var input = require('fs').readFileSync('/dev/stdin', 'utf8');
var lines = input.split('\n');
var num, n, val, str;
num = lines.length;

  var cnt = 0;
  for(n=0;n<num;++n){
    val = lines[n] * 1; // parse to integer
    var prime = new Array(val);
    if( val == 1 ){
      cnt = 0;
    }
    if( val == 2 ){
      cnt = 1;
    }
    else{
      var sq, i, j, found;
      sq = Math.sqrt(val);
      cnt = 1;
      found = 1;
      prime[0] = 2;
      for(i=3;i<sq;++i){
        for(j=0;prime[j]<=sq;++j){
          if( i % prime[j] == 0 ){
            found = 0;
            break;
          }
        }
        if( found ){
          prime[cnt++] = i;
        }
      }
    }

    str = cnt + '';
    console.log(str.length);
  }


MathJax.Hub.Config({ tex2jax: { inlineMath: [["$","$"], ["\\(","\\)"]], processEscapes: true }});

Circumscribed Circle of A Triangle.

Write a program which prints the central coordinate $(p_x, p_y)$ and the radius $r$ of a circumscribed circle of a triangle which is constructed by three points $(x_1, y_1)$, $(x_2, y_2)$ and $(x_3, y_3)$ on the plane surface.

Input

Input consists of several datasets. In the first line, the number of datasets $n$ is given. Each dataset consists of:

$x_1$ $y_1$ $x_2$ $y_2$ $x_3$ $y_3$

in a line. All the input are real numbers.

Output

For each dataset, print $p_x$, $p_y$ and $r$ separated by a space in a line. Print the solution to three places of decimals. Round off the solution to three decimal places.

Constraints

$-100 \leq x_1, y_1, x_2, y_2, x_3, y_3 \leq 100$

$ n \leq 20$

Sample Input

1
0.0 0.0 2.0 0.0 2.0 2.0

Output for the Sample Input

1.000 1.000 1.414


(function(input) {
  var p = input.replace(/\n$/, '').split('\n');
  var w = Number(p.shift());
  var n = Number(p.shift());
  var W = [];
  for (var i = 0; i < w; i++) {
    W.push(i);
  }

  for (var i = 0; i < n; i++) {
    var args = p[i].split(',').map(Number);
    var a = args[0];
    var b = args[1];
    var tmp = W[a - 1];
    W[a - 1] = W[b - 1];
    W[b - 1] = tmp;
  }
  console.log(W.map(function(e) { return e + 1; }).join('\n'));
})(require('fs').readFileSync('/dev/stdin', 'utf8'));

Drawing Lots

Let's play Amidakuji.

In the following example, there are five vertical lines and four horizontal lines. The horizontal lines can intersect (jump across) the vertical lines.

In the starting points (top of the figure), numbers are assigned to vertical lines in ascending order from left to right. At the first step, 2 and 4 are swaped by the first horizontal line which connects second and fourth vertical lines (we call this operation (2, 4)). Likewise, we perform (3, 5), (1, 2) and (3, 4), then obtain "4 1 2 5 3" in the bottom.

Your task is to write a program which reads the number of vertical lines w and configurations of horizontal lines and prints the final state of the Amidakuji. In the starting pints, numbers 1, 2, 3, ..., w are assigne to the vertical lines from left to right.

Input

w
n
a1,b1
a2,b2
.
.
an,bn

w (w ≤ 30) is the number of vertical lines. n (n ≤ 30) is the number of horizontal lines. A pair of two integers ai and bi delimited by a comma represents the i-th horizontal line.

Output

The number which should be under the 1st (leftmost) vertical line

The number which should be under the 2nd vertical line

:

The number which should be under the w-th vertical line

Sample Input

5
4
2,4
3,5
1,2
3,4

Output for the Sample Input

4
1
2
5
3


function main(){
	var s = [];
	var t = [];
	var x;
	while((x = scan()), x === x){
		if(x === 0){
			t.push(s.pop());
		}
		else{
			s.push(x);
		}
	}
	while(s.length !== 0){
		t.push(s.pop());
	}
	print(t.join('\n'));
}

function rep(a, b, c){
	if(c === undefined){
		c = b;
		b = a;
		a = 0;
	}
	for(var i = a; i < b; ++i){
		if(c(i) === false){
			break;
		}
	}
}

process.stdin.resume();
process.stdin.setEncoding('utf8');

var input = '';
var input_index = 0;

function scan(type){
	if(type === 'string'){
		return input[input_index++];
	}
	else{
		return +input[input_index++];
	}
}

function print(val){
	console.log(val);
}

process.stdin.on('data', function(chunk){
	input += chunk;
});
process.stdin.on('end', function(){
	input = input.split(/\s+/);
	main();
});

Switching Railroad Cars

This figure shows railway tracks for reshuffling cars. The rail tracks end in the bottom and the top-left rail track is used for the entrace and the top-right rail track is used for the exit. Ten cars, which have numbers from 1 to 10 respectively, use the rail tracks.

We can simulate the movement (comings and goings) of the cars as follow:

An entry of a car is represented by its number.

An exit of a car is represented by 0

For example, a sequence

1
6
0
8
10

demonstrates that car 1 and car 6 enter to the rail tracks in this order, car 6 exits from the rail tracks, and then car 8 and car 10 enter.

Write a program which simulates comings and goings of the cars which are represented by the sequence of car numbers. The program should read the sequence of car numbers and 0, and print numbers of cars which exit from the rail tracks in order. At the first, there are no cars on the rail tracks. You can assume that 0 will not be given when there is no car on the rail tracks.

Input

car number
car number or 0
car number or 0
.
.
.
car number or 0

The number of input lines is less than or equal to 100.

Output

For each 0, print the car number.

Sample Input

1
6
0
8
10
0
0
0

Output for the Sample Input

6
10
8
1


function bigAdd(A, B)
{
    var m, n, mn, i, j, carry, tmp;
    var buf, a1, a2;

    if(A.length > B.length){
        m = A.length;
        n = B.length;
        a1 = A.split("");
        a2 = B.split("");
    }
    else{
        m = B.length;
        n = A.length;
        a1 = B.split("");
        a2 = A.split("");
    }

    mn = m + 1;
    buf = new Array(mn);
    for(j=m-1,i=n-1,carry=0;i>=0;--i,--j){
        tmp = parseInt(a1[j]) + parseInt(a2[i]) + carry;
        buf[j+1] = tmp % 10;
        carry = parseInt(tmp / 10);
    }
    // Rest
    for(;j>=0;--j){
        tmp = parseInt(a1[j]) + carry;
        buf[j+1] = tmp % 10;
        carry = parseInt(tmp / 10);
    }
    buf[0] = carry;

    if( carry > 0 ){
        var merge = buf.join("");
        console.log(merge);
    }
    else{
        var merge = buf.slice(1,mn).join("");
        console.log(merge);
    }
}

process.stdin.resume();
process.stdin.setEncoding('utf8');
process.stdin.on('data', function(input){
    var line = input.trim().split("\n");
    var i = 0;
    var N = parseInt(line[i++].trim());
    {
        for(;N>0;--N){
            bigAdd(line[i], line[i+1]);
            i=i+2;
        }
    }
});


Sorting Five Numbers

Write a program which reads five numbers and sorts them in descending order.

Input

Input consists of five numbers a, b, c, d and e (-100000 ≤ a, b, c, d,e ≤ 100000). The five numbers are separeted by a space.

Output

Print the ordered numbers in a line. Adjacent numbers should be separated by a space.

Sample Input

3 6 9 7 5

Output for the Sample Input

9 7 6 5 3


let fs = require('fs');

const yourAnswerFunctionComesHere = data => {
  var splitedData = (data.trim()).split(" ").map(Number);
  var sortedData = splitedData.sort((x, y) => y - x);
  console.log(sortedData.join(" "));
}

const readFile = path => {
  fs.readFile(path, 'utf8', (err, data) => {
    yourAnswerFunctionComesHere(data);
  });
}

const readFileWithoutArg = () => {
  const data = require('fs').readFileSync('/dev/stdin', 'utf8');
  yourAnswerFunctionComesHere(data);
}

let sampleInputPath = "";

if(process.argv.length > 2) {
  sampleInputPath = process.argv[2];
  readFile(sampleInputPath);
} else {
  readFileWithoutArg();
}


function main(input){
    var ans=1;
    var inputNum=toInt(input);
    for(var i=1;i<=input;i++){
        ans=ans*i;
    }
    console.log(ans);
}
function toInt(str){
    return parseInt(str, 10);
}
main(require("fs").readFileSync("/dev/stdin", "utf8"));

Factorial

Write a program which reads an integer n and prints the factorial of n. You can assume that n ≤ 20.

Input

An integer n (1 ≤ n ≤ 20) in a line.

Output

Print the factorial of n in a line.

Sample Input

5

Output for the Sample Input

120


var input = require('fs').readFileSync('/dev/stdin', 'utf8');
var Arr=(input.trim()).split("\n");
Arr.shift();
Arr.forEach(function(v){
var arr=v.split(" ").map(Number);
arr=arr.map(function(v){return v+100;});
var ab=(arr[3]-arr[1])/(arr[2]-arr[0]);
var cd=(arr[3+4]-arr[1+4])/(arr[2+4]-arr[0+4]);
console.log(ab==cd?"YES":"NO");
});

MathJax.Hub.Config({ tex2jax: { inlineMath: [["$","$"], ["\\(","\\)"]], processEscapes: true }});

Parallelism

There are four points: $A(x_1, y_1)$, $B(x_2, y_2)$, $C(x_3, y_3)$, and $D(x_4, y_4)$. Write a program which determines whether the line $AB$ and the line $CD$ are parallel. If those two lines are parallel, your program should prints "YES" and if not prints "NO".

Input

Input consists of several datasets. In the first line, you are given the number of datasets $n$ ($n \leq 100$). There will be $n$ lines where each line correspondgs to each dataset. Each dataset consists of eight real numbers:

$x_1$ $y_1$ $x_2$ $y_2$ $x_3$ $y_3$ $x_4$ $y_4$

You can assume that $-100 \leq x_1, y_1, x_2, y_2, x_3, y_3, x_4, y_4 \leq 100$.
Each value is a real number with at most 5 digits after the decimal point.

Output

For each dataset, print "YES" or "NO" in a line.

Sample Input

2
0.0 0.0 1.0 1.0 1.0 0.0 2.0 1.0
3.0 2.0 9.0 6.0 13.0 5.0 7.0 9.0

Output for the Sample Input

YES
NO


function Main(input){
  var results = [];
  var inputs=input.split('\n');
  var length = parseInt(inputs[0]);
  if (isNaN(length) || inputs[0].split(' ').length > 1) return;
  for (var i = 0; i < length; i++) {
    var coords = inputs[i+1].split(' ');
    var gradient1 = (parseFloat(coords[0]) - parseFloat(coords[2]))/(parseFloat(coords[1]) - parseFloat(coords[3]));
    var gradient2 = (parseFloat(coords[4]) - parseFloat(coords[6]))/(parseFloat(coords[5]) - parseFloat(coords[7]));
    console.log(gradient1 === gradient2 ? 'YES' : 'NO');
  }
}
Main(require("fs").readFileSync("/dev/stdin", "utf8"));


(function(input) {
  var p = input.replace(/\n$/, '').split('\n');
  var n = Number(p.shift());
  for (var i = 0; i < n; i++) {
    var args = p.shift().split(' ').map(Number);
    var xa = args.shift();
    var ya = args.shift();
    var ra = args.shift();
    var xb = args.shift();
    var yb = args.shift();
    var rb = args.shift();
    var a = Math.pow(ra, 2);
    var b = Math.pow(rb, 2);
    var d = Math.pow(xb - xa, 2) + Math.pow(yb - ya, 2);

    if (a >= d + b) {
      console.log(2);
    } else if (b >= d + a) {
      console.log(-2);
    } else if (d <= a + b) {
      console.log(1);
    } else {
      console.log(0);
    }
  }
})(require('fs').readFileSync('/dev/stdin', 'utf8'));

MathJax.Hub.Config({ tex2jax: { inlineMath: [["$","$"], ["\\(","\\)"]], processEscapes: true }});

Circles Intersection

You are given circle $A$ with radius $r_a$ and with central coordinate $(x_a, y_a)$ and circle $B$ with radius $r_b$ and with central coordinate $(x_b, y_b)$.

Write a program which prints:

"2" if $B$ is in $A$,

"-2" if $A$ is in $B$,

"1" if circumference of $A$ and $B$ intersect, and

"0" if $A$ and $B$ do not overlap.

You may assume that $A$ and $B$ are not identical.

Input

The input consists of multiple datasets. The first line consists of an integer $N$ ($N \leq 50$), the number of datasets. There will be $N$ lines where each line represents each dataset. Each data set consists of real numbers:

$x_a$ $y_a$ $r_a$ $x_b$ $y_b$ $r_b$

Output

For each dataset, print 2, -2, 1, or 0 in a line.

Sample Input

2
0.0 0.0 5.0 0.0 0.0 4.0
0.0 0.0 2.0 4.1 0.0 2.0

Output for the Sample Input

2
0


'use strict';

var input = require('fs').readFileSync('/dev/stdin', 'utf8');
var minvs = input.trim().split('\n');
while (minvs.length !== 0) {
	console.log(Math.ceil(Math.pow(parseFloat(minvs.shift()), 2)/98 + 1));
}

MathJax.Hub.Config({ tex2jax: { inlineMath: [["$","$"], ["\\(","\\)"]], processEscapes: true }});

Physical Experiments

Ignoring the air resistance, velocity of a freely falling object $v$ after $t$ seconds and its drop $y$ in $t$ seconds are represented by the following formulas:

$ v = 9.8 t $

$ y = 4.9 t^2 $

A person is trying to drop down a glass ball and check whether it will crack. Your task is to write a program to help this experiment.

You are given the minimum velocity to crack the ball. Your program should print the lowest possible floor of a building to crack the ball. The height of the $N$ floor of the building is defined by $5 \times N - 5$.

Input

The input consists of multiple datasets. Each dataset, a line, consists of the minimum velocity v (0 < v < 200) to crack the ball. The value is given by a decimal fraction, with at most 4 digits after the decimal point. The input ends with EOF. The number of datasets is less than or equal to 50.

Output

For each dataset, print the lowest possible floor where the ball cracks.

Sample Input

25.4
25.4

Output for the Sample Input

8
8


// 標準入力
var fs = require('fs'),
length = fs.fstatSync(process.stdin.fd).size,
buffer = new Buffer(length),
bytesRead = fs.readSync(process.stdin.fd, buffer, 0, length, 0),
input = buffer.toString('utf8', 0, bytesRead).trim().split('\n');
main();

function main(){
  for(var i = 0, len = input.length; i < len; i++){
    var c = input[i].split(' ');
    if(+c[1] && +c[0]){
      var date = new Date(2004, c[0]-1, +c[1]);
      console.log(['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'][date.getDay()]);
    }
  }

}

What day is today?

Your task is to write a program which reads a date (from 2004/1/1 to 2004/12/31) and prints the day of the date. Jan. 1, 2004, is Thursday. Note that 2004 is a leap year and we have Feb. 29.

Input

The input is a sequence of datasets. The end of the input is indicated by a line containing one zero. Each dataset consists of two integers m and d separated by a single space in a line. These integers respectively represent the month and the day.

The number of datasets is less than or equal to 50.

Output

For each dataset, print the day (please see the following words) in a line.

Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
Sunday

Sample Input

1 1
2 29
0 0

Output for the Sample Input

Thursday
Sunday


x=require('fs').readFileSync('/dev/stdin','utf8').trim().split(/\s/).sort(function(a,b){return a-b;});
console.log(x);
for(mode=[],cnt=0,i=0;i<x.length;i++){
    temp_cnt=1;
    for(j=i+1;j<x.length;j++){
        if(x[i]==x[j]){
            temp_cnt++;
        }
    }
    if(temp_cnt>=cnt){
        cnt=temp_cnt;
        mode.push(x[i]);
    }
}
console.log(mode);

Mode Value

Your task is to write a program which reads a sequence of integers and prints mode values of the sequence.
The mode value is the element which occurs most frequently.

Input

A sequence of integers ai (1 ≤ ai ≤ 100). The number of integers is less than or equals to 100.

Output

Print the mode values. If there are several mode values, print them in ascending order.

Sample Input

5
6
3
5
8
7
5
3
9
7
3
4

Output for the Sample Input

3
5

For example, 3 and 5 respectively occur three times, 7 occurs two times, and others occur only one. So, the mode values are 3 and 5.


function bomb(n,sum,str,before){
   if(n==N && sum==S)cnt++;
   if(n==N)return;
   var arr=str.split("").map(Number);
   arr.forEach(function(v){
      if(before<v)bomb(n+1,sum+v,str.replace(v,""),v);
   });
}
var input = require('fs').readFileSync('/dev/stdin', 'utf8');
var Arr=(input.trim()).split("\n");
while(true){
   var NS=Arr.shift().split(" ").map(Number);
   var N=NS[0];
   var S=NS[1];
   if(N==0 && S==0)break;
   var cnt=0;
   bomb(0,0,"0123456789",-1);
   console.log(cnt);
}

整数の和

0 から 9 の数字から異なる n 個の数を取り出して合計が s となる組み合わせの数を出力するプログラムを作成してください。n 個の数はおのおの 0 から 9 までとし、１つの組み合わせに同じ数字は使えません。たとえば、n が 3 で s が 6 のとき、3 個の数字の合計が 6 になる組み合わせは、

1 + 2 + 3 = 6

0 + 1 + 5 = 6

0 + 2 + 4 = 6

の 3 通りとなります。

Input

複数のデータセットが与えられます。各データセットに n (1 ≤ n ≤ 9) と s (0 ≤ s ≤ 100) が１つのスペースで区切られて１行に与えられます。n と s が共に 0 のとき入力の最後とします（この場合は処理せずにプログラムを終了する）。

データセットの数は 50 を超えません。

Output

各データセットに対して、n 個の整数の和が s になる組み合わせの数を１行に出力して下さい。

Sample Input

3 6
3 1
0 0

Output for the Sample Input

3
0


var input = require('fs').readFileSync('/dev/stdin', 'utf8');
var arr=input.trim().split("\n");
arr.some(function(v){
   if(v=="0 0")return true;
   var ns=v.split(" ").map(Number);
   var n=ns[0];
   var s=ns[1];
   var all=[];
   var loop=function(start,sum,cnt){
      if(cnt==n)all.push(sum);
      else{
         for(var i=start;i<=9;i++){
            loop(i+1,sum+i,cnt+1);
         }
      }
   }
   loop(0,0,0);
   var cnt=0;
   all.forEach(function(v){
      if(v==s)cnt++;
   });
   console.log(cnt);
});


var weights = [];
for (var i = 0; i < 10; i++) {
	weights[i] = 1 << i;
}

var input = require('fs').readFileSync('/dev/stdin', 'utf8');
var lines = input.trim().split('\n');

var line;
while (line = lines.shift()) {
	var w = +line;
	var result = [];
	for (var i = 0; i < weights.length; i++) {
		if (w & weights[i])
			result.push(weights[i]);
	}
	console.log(result.length == 0 ? 0 : result.join(' '));
}

Weight

祖母が天秤を使っています。天秤は、二つの皿の両方に同じ目方のものを載せると釣合い、そうでない場合には、重い方に傾きます。10 個の分銅の重さは、軽い順に 1g, 2g, 4g, 8g, 16g, 32g, 64g, 128g, 256g, 512g です。

祖母は、「1kg くらいまでグラム単位で量れるのよ。」と言います。「じゃあ、試しに、ここにあるジュースの重さを量ってよ」と言ってみると、祖母は左の皿にジュースを、右の皿に 8g と64g と128g の分銅を載せて釣合わせてから、「分銅の目方の合計は 200g だから、ジュースの目方は 200g ね。どう、正しいでしょう？」と答えました。

左の皿に載せる品物の重さを与えるので、天秤で与えられた重みの品物と釣合わせるときに、右の皿に載せる分銅を軽い順に出力するプログラムを作成して下さい。ただし、量るべき品物の重さは、すべての分銅の重さの合計 (=1023g) 以下とします。

Input

複数のデータセットが与えられます。各データセットに、左の皿に載せる品物の重さが１行に与えられます。入力の最後まで処理して下さい。データセットの数は 50 を超えません。

Output

各データセットに対して、右の皿に載せる分銅（昇順）を１つの空白で区切って、１行に出力して下さい。

Sample Input

5
7
127

Output for the Sample Input

1 4
1 2 4
1 2 4 8 16 32 64

Hint

分銅の重さは 2 の n 乗 ( n = 0, 1, .... 9 )g です。


鉄道路線

複線（上りと下りが別の線路になっていてどこででもすれ違える）の鉄道路線があります。この路線には終端駅を含めて11 の駅があり、それぞれの駅と駅の間は図で示す区間番号で呼ばれています。

この路線の両方の終端駅から列車が同時に出発して、途中で停まらずに走ります。各区間の長さと2 本の列車の速度を読み込んで、それぞれの場合について列車がすれ違う区間の番号を出力するプログラムを作成してください。ただし、ちょうど駅のところですれ違う場合は、両側の区間番号のうち小さいほうの数字を出力します。また、列車の長さ、駅の長さは無視できるものとします。

Input

複数のデータセットが与えられる。各データセットは以下のような形式で与えられる。

l1,l2,l3,l4,l5,l6,l7,l8,l9,l10,v1,v2

li (1 ≤ li ≤ 2,000) は区間 i の長さ(km)を表す整数である。v1 は区間 1 側の終端駅を出発した列車の速度(km/h)、v2 は区間 10 側の終端駅を出発した列車の速度(km/h)を表す整数である (1 ≤ v1, v2 ≤ 2,000)。

データセットの数は 50 を超えない。

Output

データセットごとに、列車がすれちがう区間の番号を１行に出力する。

Sample Input

1,1,1,1,1,1,1,1,1,1,40,60
1,1,1,1,1,3,3,3,3,3,50,50
10,10,10,10,10,10,10,10,10,10,50,49

Output for the Sample Input

4
7
6


平面上の図形

縦 8、横 8 のマスからなる図 1 のような平面があります。

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

図１

この平面上に、以下の A から G の図形のどれかが一つだけ置かれています。

A

■

■

■

■

B

■

■

■

■

C

■

■

■

■

D

■

■

■

■

E

■

■

■

■

F

■

■

■

■

G

■

■

■

■

たとえば、次の図 2 の例では E の図形が置かれています。

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

■

■

□

□

□

□

□

□

□

■

■

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

□

図２

平面の中で図形が占めているマスを 1、占めていないマスを 0 で表現した数字の列を読み込んで、置かれている図形の種類（A〜G）を出力するプログラムを作成してください。

ただし、ひとつの平面に置かれている図形は必ず１つで、複数の図形が置かれていることはありません。また、A〜G で表される図形以外のものが置かれていることはありません。

Input

入力は複数のデータセットからなります。

１つのデータセットとして、平面の中で図形が占めているマスを 1、占めていないマスを 0 で表現した 8 文字からなる 8 つの文字列が与えられます。例えば、図 2 に対応する文字列の並びは次のようになります。

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

1

1

0

0

0

0

0

0

0

1

1

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

データセットの間は１つの空行で区切られています。データセットの数は 50 を超えません。

Output

各データセットごとに、平面に与えられた図形の種類（A〜G のいずれか）を１行に出力してください。

Sample Input

00000000
00000000
01100000
00110000
00000000
00000000
00000000
00000000

00011110
00000000
00000000
00000000
00000000
00000000
00000000
00000000

00000000
00000000
00110000
00110000
00000000
00000000
00000000
00000000

Output for the Sample Input

E
C
A


process.stdin.resume();
process.stdin.setEncoding('utf8');

var _HEIGHT = 8;
//入力
var input_string = '';
process.stdin.on('data', function(chunk) {
    input_string += chunk.toString();
});

//main処理
process.stdin.on('end', function() {
    //入力 -> Array
    var lines = input_string.split('\n');
    lines = lines.filter(function(val) {
        return val !== '';
    });
    // ８個ずつ
    while (lines.length >= _HEIGHT) {
        var matrix = lines.splice(0, 8);

        judge(matrix);
    }
});

function judge(ary) {
    tmpAry = ary.filter(function(val) {
       return val.indexOf('1') > 0;
    });

    compShape(tmpAry);
}

function compShape(ary) {
    switch (ary.length) {
        case 1:
            console.log('C')
            break;
        case 2:
            case2(ary);
            break;
        case 3:
            case3(ary);
            break;
        case 4:
            console.log('B')
            break;
        default:
            console.log('Error');
    }
}

function case2(ary) {
    ind0 = ary[0].indexOf('1');
    ind1 = ary[1].indexOf('1');

    if (ind0 < ind1) {
        console.log('E');
    }
    else if (ind0 > ind1) {
        console.log('G');
    }
    else {
        console.log('A');
    }
}

function case3(ary) {
    ind0 = ary[0].indexOf('1');
    ind1 = ary[1].indexOf('1');

    if (ind0 > ind1) {
        console.log('D');
    }
    else {
        console.log('F');
    }
}


ローマ数字

古代ローマでは数を数えることは難しい仕事でした。アラビア数字の 0,1,2,3,…, 9 はまだ流布していませんでした。その代わり次のような記号が使われていました。

アラビア数字

ローマ数字

アラビア数字

ローマ数字

アラビア数字

ローマ数字

1

I

11
XI

30

XXX

2

II

12
XII

40

XL

3

III

13
XIII

50

L

4

IV

14
XIV

60

LX

5

V

15
XV

70

LXX

6

VI

16
XVI

80

LXXX

7

VII

17
XVII

90

XC

8

VIII

18
XVIII

100

C

9

IX

19
XIX

500

D

10

X

20
XX

1000

M

I は 1、 V は 5、 X は 10、 L は 50、 C は 100、 D は 500、 M は 1000、 他の例は上の表を見てください。小さい数が大きい数に続いている、つまり右側にあるときは足し算をします。小さい数が大きい数の前に、つまり左にあるときは、大きい数から小さい数を引きます。大きい数字の前にあって引き算を表す小さな数字は一回の引き算あたりひとつしかありません。

ローマ数字をアラビア数字（通常の数字）の表記（10 進表示）に変換して出力するプログラムを作成してください。ただし、与えられるローマ数字は上記のルールにのみ従っています(実際のローマ数字の表記にはもっと細かいルールがありますが、ここでは考慮する必要はありません。たとえば、実際のローマ数字ではI はV かX から、X はL かC から、C はD かM からしか引き算しませんし、同じローマ数字は４つ以上（または５つ以上）足し並べることはありません。)

Input

複数のデータセットが与えられます。それぞれのデータセットにローマ数字（半角大文字のI, V, X, L, C, D ,M で表される連続した文字列）が１行に与えられます。与えられるローマ数字の文字列の長さはおのおの 100 以下です。

データセットの数は 50 を超えません。

Output

各データセットに対し、アラビア数字（整数）を１行に出力して下さい。

Sample Input

IV
CCCCLXXXXVIIII
CDXCIX

Output for the Sample Input

4
499
499


// 標準入力
var fs = require('fs'),
length = fs.fstatSync(process.stdin.fd).size,
buffer = new Buffer(length),
bytesRead = fs.readSync(process.stdin.fd, buffer, 0, length, 0),
input = buffer.toString('utf8', 0, bytesRead).split('\n');
main();

function main(){
  var read = 0;
  var resultCase = 1;
  while(true){
    var maxWeight = +input[read++];
    if(!maxWeight){
      break;
    }

    var treasures = +input[read++];
    var pdp = new Int32Array(maxWeight + 1);
    for(var i = treasures; i--;){
      var c = input[read++].split(",");
      var tv = +c[0];
      var tw = +c[1];

      var dp = new Int32Array(maxWeight + 1);
      for(var w = 1; w <= maxWeight; w++){
        if(w - tw < 0){
          dp[w] = pdp[w];
        }else{
          dp[w] = max(pdp[w-tw] + tv, pdp[w]);
        }
      }
      pdp = dp;
    }

    var resultWeight = 1001;
    var resultCost = 0;
    for(var i = 0; i <= maxWeight; i++){
      if(pdp[i] > resultCost){
        resultCost = pdp[i];
        resultWeight = i;
      }
    }

    console.log("Case " + resultCase++ + ":\n" + resultCost + "\n" + resultWeight);
  }
}

function max(a, b) {
  var t = a - b;
  return a - (t & (t >> 31));
}

泥棒

宝物がたくさん収蔵されている博物館に、泥棒が大きな風呂敷を一つだけ持って忍び込みました。盗み出したいものはたくさんありますが、風呂敷が耐えられる重さが限られており、これを超えると風呂敷が破れてしまいます。そこで泥棒は、用意した風呂敷を破らず且つ最も価値が高くなるようなお宝の組み合わせを考えなくてはなりません。

風呂敷が耐えられる重さ W、および博物館にある個々のお宝の価値と重さを読み込んで、重さの総和が W を超えない範囲で価値の総和が最大になるときの、お宝の価値総和と重さの総和を出力するプログラムを作成してください。ただし、価値の総和が最大になる組み合わせが複数あるときは、重さの総和が小さいものを出力することとします。

Input

複数のデータセットが与えられます。各データセットは以下のような形式で与えられます。

W
N
v1,w1
v2,w2
:
vN,wN

１行目に風呂敷の耐えられる重さを表す整数 W (W ≤ 1,000)、２行目にお宝の数 N (1 ≤ N ≤ 1,000) が与えられます。続く N 行に i 番目のお宝の価値を表す整数 vi (0 ≤ vi ≤ 10,000) とその重さを表す整数 wi (0 ≤ wi ≤ W) の組がそれぞれ１行に与えられます。

W が 0 のとき入力の最後とします。データセットの数は 50 を超えません。

Output

各データセットに対して以下のように出力して下さい。

Case データセットの番号:
風呂敷に入れたお宝の価値総和
そのときのお宝の重さの総和

Sample Input

50
5
60,10
100,20
120,30
210,45
10,4
50
5
60,10
100,20
120,30
210,45
10,4
0

Output for the Sample Input

Case 1:
220
49
Case 2:
220
49


標高差

今まで登ったことのある山の標高を記録したデータがあります。このデータを読み込んで、一番高い山と一番低い山の標高差を出力するプログラムを作成してください。

Input

入力は以下の形式で与えられます。

山の高さ
...
...

山の高さが複数行に渡って与えられます。入力される値はすべて 0 以上 1,000,000 以下の実数です。入力される山の高さの数は 50 以下です。

Output

一番高い山と一番低い山の標高差を実数で出力する。出力は0.01以下の誤差を含んでもよい。

Sample Input

3776.0
1819.0
645.2
2004.1
1208.6

Output for the Sample Input

3130.8


var input = require('fs').readFileSync('/dev/stdin', 'utf8');
var Arr=(input.trim()).split("\n");
var AL=Arr.shift();
for(var i=0;i<AL;i++){
   var arr=Arr[i].split("").map(Number);
   arr.sort(function(a,b){return b-a;});
   var a=arr.join("");
   arr.sort(function(a,b){return a-b;});
   var b=arr.join("");
   console.log(parseInt(a,10)-parseInt(b,10));
}

整数の差

8 個の 0 から 9 までの数字を入力したとき、その 8 個の数字を並べ替えてできる、最大の整数と最小の整数の差を出力するプログラムを作成してください。並び替えてできる数は 00135569 のように 0 から始まってもよいものとします。

Input

複数のデータセットが与えられます。１行目にデータセット数 n (n ≤ 50) が与えられます。続いて n 行のデータが与えられます。各データは 8 個の数字の並び（0 から 9 の数字）です。

Output

各データセットに対して、入力された数字を並べ替えてできる最大の整数と最小の整数の差を１行に出力して下さい。

Sample Input

2
65539010
65539010

Output for the Sample Input

96417531
96417531


var input = require('fs').readFileSync('/dev/stdin', 'utf8');
var lines = input.split('\n');
var j = 0;
while (j < lines.length - 1) {
  var str = lines[j];
  var nums = str.split('').map(Number);
  var next;
  while (nums.length > 1) {
    next = [];
    for (var i = 0; i < nums.length - 1; i++) {
      next[i] = (nums[i] + nums[i + 1]) % 10;
    }
    nums = next;
  }
  console.log(nums[0]);
  j++;
}

一番下の行の数字は?

次のような数字のパターンを作ることを考えます。

4 8 2 3 1 0 8 3 7 6
2 0 5 4 1 8 1 0 3
2 5 9 5 9 9 1 3
7 4 4 4 8 0 4
1 8 8 2 8 4
9 6 0 0 2
5 6 0 2
1 6 2
7 8
5

このパターンは以下の規則に従っています。

A B
C

という数字の並びにおいて、C は A + B の 1 の位の数字である。たとえば、

9 5
4

では、9 + 5 = 14 の 1 の位の数字、すなわち 4 が 9 と 5 の斜め下に並べられます。また、

2 3
5

では、2 + 3 = 5 の 1 の位の数字、すなわち 5 が 2 と 3 の斜め下に並べられます。

一番上の行の 10 個の整数を読み込んで、一番下の行の 1 個の数を出力するプログラムを作成してください。

Input

入力は複数のデータセットからなります。各データセットとして、一番上の行の 10 個の数字が文字列として１行に与えられます。

データセットの数は 20 を超えません。

Output

データセットごとに、一番下の行の数字を１行に出力します。

Sample Input

4823108376
1234567890
0123456789

Output for the Sample Input

5
6
4


var input = require('fs').readFileSync('/dev/stdin', 'utf8').trim();
var lines = input.split('\n');

var sum = 0;
var line;
while (line = lines.shift()) {
    var arr = line.split(/\D+/);
    sum += arr.reduce(function(p,n){return p + (+n);},0);
}
console.log(sum);

暗証番号

新しい暗証番号は覚えにくいものです。メモするのはダメといわれましたが、覚えられそうにありません。そこで文章の中に数値を埋め込んで暗証番号をメモすることにしました。ここでは全ての数値の和が暗証番号になります。

メモされた文章を読み込んで、暗証番号を出力するプログラムを作成してください。

Input

正の整数が埋め込まれた文章が複数行にわたり与えられます。各行は半角英数字、記号、空白を含む文字列または空行です。
ただし、入力は 1 行あたり 80 文字以内で、暗証番号は 10,000 以下であることが保障されています。

Output

暗証番号（文章中の正の整数の合計）を１行に出力します。

Sample Input

Thereare100yenonthetable.Iam17yearsold.
Ishouldgohomeat6pm.

Output for the Sample Input

123


var input = require('fs').readFileSync('/dev/stdin', 'utf8').trim();
var lines = input.split('\n');

while (lines.length > 0) {
    var path = [];
    var line;
    while ((line = lines.shift()) != '0 0') {
        var nums = line.split(' ');
        var from = +nums[0];
        var to = +nums[1];

        path[from] = (path[from] || 0) +1;
        path[to] = (path[to] || 0) +1;
    }
    var odds = path.filter(function(n){return n % 2 == 1});
    if (odds.length > 2)
        console.log('NG');
    else
        console.log('OK');
}

パトロール

文久２（1862）年、会津の殿様が京都守護職を命ぜられました。京都守護職とは治安の悪化した幕末の京都を守る大切な役目です。幕府や他の藩と分担して市中をパトロールしなければなりません。ところがいざ分担ルートを決める段になって、家臣の中でも有名な頑固者の古老から以下のような注文がつきました。

大変なことになりました。殿様といえどもこの家臣の言い分を無視するわけにはいきません。分担ルートの選択によっては、「武士の面目が立たない」ということになってしまいます。

ということで、スタート地点、ゴール地点、交差点の情報を入力として、上の三つの条件を満たすかどうかを判定するプログラムを作って、殿様に献上してください。

スタート地点を 1、ゴール地点を2、その他の交差点を 3 以上の整数で表します。1つの道路は、その道が結ぶ1組の交差点番号で表します。なお、交差点の数は 100 以下とし、全ての交差点からスタート地点およびゴール地点への経路がそれぞれ一つ以上あるものとします。

入力

複数のデータセットが与えられます。各データセットは以下の形式で与えられます。

a1 b1
a2 b2
：
：
0 0

各行の２つの整数は、交差点 ai と交差点 bi とをつなぐ道路が存在することを示します。
ai と bi がともに 0 のとき交差点情報の入力の終わりを示します。

データセットの数は50を超えません。

出力

各データセットに対して、武士の面目が立つ場合（三つの条件を満たす場合）OK、それ以外の場合（三つの条件を満たさない場合）NG と１行に出力してください。

Sample Input

1 3
3 4
3 5
3 6
4 6
4 7
4 7
5 6
6 7
5 8
5 8
6 8
6 9
7 9
8 9
9 2
0 0
1 3
3 4
3 4
4 2
0 0

Output for the Sample Input

OK
NG


function check(x){
if(x%4!=0)return false;
if(x%400==0)return true;
if(x%100==0)return false;
return true;
}

var input = require('fs').readFileSync('/dev/stdin', 'utf8');
var Arr=(input.trim()).split("\n");
for(var i=0;i<Arr.length;i++){
   if(Arr[i]=="0 0")break;
   if(i!=0)console.log("");
   var a=(Arr[i].split(" "))[0]-0;
   var b=(Arr[i].split(" "))[1]-0;
   var arr=[];
   for(var j=a;j<=b;j++){
      if(check(j))arr.push(j);
   }
   if(arr.length==0)console.log("NA");
   if(arr.length!=0)arr.forEach(function(v){console.log(v);});
}

うるう年

西暦 a 年から b 年までの間にあるすべてのうるう年を出力するプログラムを作成してください。

うるう年の条件は、次のとおりとします。ただし、0 < a ≤ b < 3,000 とします。与えられた期間にうるう年がない場合には "NA"と出力してください。

西暦年が 4 で割り切れる年であること。

ただし、100 で割り切れる年はうるう年としない。

しかし、400 で割り切れる年はうるう年である。

Input

複数のデータセットが与えられます。各データセットの形式は以下のとおりです：

a b

a, b がともに 0 のとき入力の終了とします。データセットの数は 50 を超えません。

Output

データセットごとに、西暦または NA を出力してください。

データセットの間に１つの空行を入れてください。

Sample Input

2001 2010
2005 2005
2001 2010
0 0

Output for the Sample Input

2004
2008

NA

2004
2008


x=require('fs').readFileSync('/dev/stdin','utf8').trim().split(/\s/);

for(i=0;i<x.length-2;i+=2){
    count=0;
    y=x[i];
    if(i!=0||i==x.length-1)console.log("");
    if(y+x[i+1]==0)break;
    arr=[];
    for(;y<=x[i+1];y++){
        if (y % 400 == 0 || (y % 4 == 0 && y % 100 != 0)){
            //console.log(y);
            arr.push(y);
            count++;
        }
    }

    if(count==0){
        console.log("NA");
    }else{
        arr.forEach(function(v){console.log(v);});
    }

}


var input = require('fs').readFileSync('/dev/stdin', 'utf8');
var arr=input.trim().split("\n");
var n=arr.shift()-0;
var yx=[];
var zero=[];
for(var i=0;i<n+1;i++)zero.push(0);
yx.push(zero);
for(var i=0;i<n;i++)yx.push(("0 "+arr.shift()).split(" ").map(Number));
n=n+1;
var sum=[];
for(var i=0;i<n;i++){
   sum[i]=[];
   sum[i][0]=yx[i][0];
}
for(var i=0;i<n;i++){
   for(var j=1;j<n;j++){
      sum[i][j]=sum[i][j-1]+yx[i][j];
   }
}
for(var i=1;i<n;i++){
   for(var j=0;j<n;j++){
      sum[i][j]=sum[i-1][j]+sum[i][j];
   }
}
var max=-Infinity;
for(var i=0;i<n;i++){
   for(var j=0;j<n;j++){
      for(var y=i+1;y<n;y++){
         for(var x=j+1;x<n;x++){
            max=Math.max(max,sum[y][x]-sum[i][x]-sum[y][j]+sum[i][j]);
         }
      }
   }
}
console.log(max);

Maximum Sum Sequence II

与えられた整数の行列

a1,1 a1,2 ... a1,n
a2,1 a2,2 ... a2,n
:
an,1 an,2 ... an, n

で、縦・横方向に１つ以上連続した項（部分行列）の和の最大値を出力して終了するプログラムを作成して下さい。

Input

入力データは以下の形式で与えられます。

n
a1,1 a1,2 ... a1,n
a2,1 a2,2 ... a2,n
:
an,1 an,2 ... an, n

n は 1 以上 100 以下、ai,j は -10000 以上 10000 以下です。

Output

最大値を 1 行に出力して下さい。

Sample Input 1

3
1 -2 3
-4 5 6
7 8 -9

Output for the Sample Input 1

16

この入力の場合、以下の部分行列の項の和が最大となります。

-4 5
7 8

Sample Input 2

4
1 3 -9 2
2 7 -1 5
-8 3 2 -1
5 0 -3 1

Output for the Sample Input 2

15

この入力の場合、以下の部分行列の項の和が最大となります。

7 -1 5
3 2 -1


process.stdin.resume();
process.stdin.setEncoding('utf8');
process.stdin.on('data', function(input){
    var line = input.trim().split("\n");
    var i = 0;
    while(line[i] !== '0')
    {
        var N = parseInt(line[i++].trim());
        {
            var found, len, k, res;
            var qualified = [], amount = [];
            for(--N;N>=0;--N){
                var dataset = line[i++].trim().split(" ");
                res = parseInt(dataset[1]) * parseInt(dataset[2]);

                found = 0;
                for(k=0;k<qualified.length;++k){
                    if(qualified[k] == dataset[0]){
                        found = 1;
                        amount[k] = amount[k] + res;
                        break;
                    }
                }

                if( !found ){
                    qualified.push(dataset[0]);
                    amount.push(res);
                }
            }

            found = 0;
            len = qualified.length;
            for(k=0;k<len;++k){
                if( amount[k] >= 1000000 ){
                    console.log(qualified[k]);
                    found = 1;
                }
            }
            if( !found ){
                console.log("NA");
            }
        }
    }
});

Sale Result

There is data on sales of your company. Your task is to write a program which identifies good workers.

The program should read a list of data where each item includes the employee ID i, the amount of sales q and the corresponding unit price p. Then, the program should print IDs of employees whose total sales proceeds (i.e. sum of p × q) is greater than or equal to 1,000,000 in the order of inputting. If there is no such employees, the program should print "NA". You can suppose that n < 4000, and each employee has an unique ID. The unit price p is less than or equal to 1,000,000 and the amount of sales q is less than or equal to 100,000.

Input

The input consists of several datasets. The input ends with a line including a single 0. Each dataset consists of:

n (the number of data in the list)
i p q
i p q
:
:
i p q

Output

For each dataset, print a list of employee IDs or a text "NA"

Sample Input

4
1001 2000 520
1002 1800 450
1003 1600 625
1001 200 1220
2
1001 100 3
1005 1000 100
2
2013 5000 100
2013 5000 100
0

Output for the Sample Input

1001
1003
NA
2013


var print = console.log;

function read_input(_input) {
    var lines = _input.split("\n");
    var i = 0;
    return function () {
        return lines[i++];
    };
}

String.prototype.dot = function dot(x) {
    var res = "";
    for (var i = 0; i < x; i++) {
        res += this.toString();
    }
    return res;
};

function IL(line, min1Flg) {
    var s = line.split(' ');
    var offset = min1Flg ? -1 : 0;
    var res = [];
    for (var i = 0; i < s.length; i++) {
        res.push(parseInt(s[i]));
    }
    return res;
}

function range(i, n) {
    var res = [];
    for (; i < n; i++) {
        res.push(i);
    }
    return res;
}

function IMAX(x, y) {
    return x > y ? x : y;
}

function IMIN(x, y) {
    return x < y ? x : y;
}

function item_getter_key(x) {
    return function (a, b) {
        if (a[x] < b[x]) return -1;
        else if (a[x] > b[x]) return 1;
        return 0;
    };
}

/*

(((???????????)??? ????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????

*/

// input?????\??????????????¨????????\???
function Main(_input) {
    var input = read_input(_input); // input = ?????????????????¢??°
    var N = parseInt(input());
    for (var i = 0; i < N ; i++) {
        var out = 0;
        var runner = 0;
        var pt = 0;
        while (out < 3) {
            var v = input();
            if (v === 'HIT') {
                if (runner === 3) {
                    pt += 1;
                } else {
                    runner++;
                }
            } else if (v === 'HOMERUN') {
                pt += runner + 1;
                runner = 0;
            } else {
                out++;
            }
        }
        print(pt);
    }

}

//*???????????\????????¨??????????????§????????????????¨??????\????????????????????????????????????Main????????????????????????
Main(require("fs").readFileSync("/dev/stdin", "utf8"));
//Main(require("fs").readFileSync("input.txt", "utf8"));

Baseball Simulation

Ichiro likes baseball and has decided to write a program which simulates baseball.

The program reads events in an inning and prints score in that inning. There are only three events as follows:

Single hit

put a runner on the first base.

the runner in the first base advances to the second base and the runner in the second base advances to the third base.

the runner in the third base advances to the home base (and go out of base) and a point is added to the score.

Home run

all the runners on base advance to the home base.

points are added to the score by an amount equal to the number of the runners plus one.

Out

The number of outs is increased by 1.

The runners and the score remain stationary.

The inning ends with three-out.

Ichiro decided to represent these events using "HIT", "HOMERUN" and "OUT", respectively.

Write a program which reads events in an inning and prints score in that inning. You can assume that the number of events is less than or equal to 100.

Input

The input consists of several datasets. In the first line, the number of datasets n is given. Each dataset consists of a list of events (strings) in an inning.

Output

For each dataset, prints the score in the corresponding inning.

Sample Input

2
HIT
OUT
HOMERUN
HIT
HIT
HOMERUN
HIT
OUT
HIT
HIT
HIT
HIT
OUT
HIT
HIT
OUT
HIT
OUT
OUT

Output for the Sample Input

7
0


var input = require('fs').readFileSync('/dev/stdin', 'utf8');
var Arr=(input.trim()).split("\n");
var obj={};
for(var i=0;i<Arr.length;i++){
   var arr=Arr[i].split(" ");
   var a=arr[0];
   var b=arr[1];
   if(a in obj) obj.a+=" "+b;
   else  obj.a=b
}
var keys=[];
for(var k in obj)keys.push(k);
keys.sort();
for(var i=0;i<keys.length;i++){
   console.log(keys[i]+"\n"+obj[keys[i]]);
}

Book Index

Books are indexed. Write a program which reads a list of pairs of a word and a page number, and prints the word and a list of the corresponding page numbers.

You can assume that a word consists of at most 30 characters, and the page number is less than or equal to 1000. The number of pairs of a word and a page number is less than or equal to 100. A word never appear in a page more than once.

The words should be printed in alphabetical order and the page numbers should be printed in ascending order.

Input

word page_number
:
:

Output

word
a_list_of_the_page_number
word
a_list_of_the_Page_number
:
:

Sample Input

style 12
even 25
introduction 3
easy 9
style 7
document 13
style 21
even 18

Output for the Sample Input

document
13
easy
9
even
18 25
introduction
3
style
7 12 21


var
input = '';

process.stdin.resume();
process.stdin.setEncoding('utf8');
process.stdin.on('data', function(chunk) {
    input += chunk;
});
process.stdin.on('end', function() {
    input = input.split('\n');
    main();
});

function main() {
    var
    i,
    n = +input[0],
    lines = input.slice(1);
    for(i = 0; i < n; i++) {
        console.log(calc(lines[i]));
    }
}

function calc(src) {
    var
    v, n,
    op = {'+': 1,'-': 1,'*': 2,'/': 2},
    ns = [],
    os = [];
    src = src.replace(/([-+*\/=()])/g, ' $1 ').split(' ');
    while((v = src.shift()) !== '=') {// console.log(v || ' ', ns, os);
        if(!v) continue;
	n = parseInt(v, 10);
        debugger;
	if(isNaN(n)) {
            if(op[v] && os.length && op[v] < op[os[0]]) {
                ns.push(oeval(os.shift(), ns.pop(), ns.pop()));
            }
	    if(op[v] || v === '(') {
	        os.unshift(v);
	    }
	    if(v === ')') {
                while((v = os.shift()) !== '(') {
                    ns.push(oeval(v, ns.pop(), ns.pop()));
	        }
	    }
        } else {
	    ns.push(n);
	}
    }
    while((v = os.shift()) !== undefined) {
	ns.push(oeval(v, ns.pop(), ns.pop()));
    }
    return ns[0];

    function oeval(op, b, a) {
	switch(op) {
	    case '+':
		return a + b;
            case '-':
		return a - b;
            case '*':
		return a * b;
            case '/':
		return Math.floor(a / b);
	}
    }
}

Smart Calculator

Your task is to write a program which reads an expression and evaluates it.

The expression consists of numerical values, operators and parentheses, and the ends with '='.

The operators includes +, - , *, / where respectively represents, addition, subtraction, multiplication and division.

Precedence of the operators is based on usual laws. That is one should perform all multiplication and division first, then addition and subtraction. When two operators have the same precedence, they are applied from left to right.

You may assume that there is no division by zero.

All calculation is performed as integers, and after the decimal point should be truncated

Length of the expression will not exceed 100.

-1 × 109 ≤ intermediate results of computation ≤ 109

Input

The input is a sequence of datasets. The first line contains an integer n which represents the number of datasets. There will be n lines where each line contains an expression.

Output

For each datasets, prints the result of calculation.

Sample Input

2
4-2*3=
4*(8+4+3)=

Output for the Sample Input

-2
60


function main(){
  var i = 0;
  while(true){
    var fieldInfo = input[i].split(' ');
    var width = fieldInfo[0] - 0;//toInt
    var height = fieldInfo[1] - 0;//toInt

    // 0 0が入力された
    if(!width && !height){
      break;
    }

    var start;
    var goal;
    var elem = [[],[],[],[],[]];
    for(var ei = 0;ei < 5; ei++){
      elem[ei].length = 0;
    }

    for(var y = 0; y < height; y++){
      i++;//1行進める
      for(var x = 0; x < width; x++){
        var c = input[i][x];

        switch(c){
        case 'S':
          start = new Pos(x, y);
          break;
        case 'G':
          goal = new Pos(x, y);
          break;
        case '.':
          break;
        default : // 入力値が正しいので、絶対に属性
          elem[c-1][elem[c-1].length] = new Pos(x, y);
          break;
        }
      }
    }

    var bestElement = -1;
    var distance = Infinity;

    // 属性ごとにループ
    for (var startElem = 0; startElem < 5; startElem++) {
      // DPの初期化 DP[属性][同じ属性内の連番]
      var dp = [[],[],[],[],[]];
      for(var h = 0; h < 5; h++){
        var hLength = elem[h].length;
        dp[h].length = hLength;
        for(var hidx = 0; hidx < hLength; hidx++){
          dp[h][hidx] = Infinity;
        }
      }

      // 最初に選んだパチモンから次に捕まえられる属性番号
      var first = (startElem + 1) % 5;

      for (var j = 0, firstLength = elem[first].length; j < firstLength; j++) {
        // s→e1を計算
        dp[first][j] = dist(start, elem[first][j]);
      }

      // s->1->2->3->4->g
      // なので、ループは間の-> * 3分まわす
      for (var e = 0; e < 3; e++) {
        // ex->e(x+1)
        var now = (first + e) % 5;
        var next = (now + 1) % 5;

        for (var j = 0, nowLength = elem[now].length; j < nowLength; j++) {
          for (var k = 0, nextLength = elem[next].length; k < nextLength; k++) {
            dp[next][k] = min(
              dp[next][k],
              dp[now][j] +
                  dist(elem[now][j], elem[next][k]));
          }
        }
      }

      var last = (first + 3) % 5;
      var lastLength = elem[last].length;
      for (var j = 0; j < lastLength; j++) {
        // e4->g
        var d = dp[last][j] +
                    dist(elem[last][j], goal);

        if (d < distance) {
          distance = d;
          bestElement = startElem + 1;
        }

      }

    }

    if (distance == Infinity) {
      console.log("NA");
    } else {
      console.log(bestElement + " " + distance);
    }

    i++;
  }

}

function dist(from, to){
  return Math.abs(from.x - to.x) + Math.abs(from.y - to.y)
}

function min(a1, a2){
  return a1 < a2 ? a1 : a2;
}

function Pos(a, b){
  this.x = a;
  this.y = b;
}

var
input = '';

process.stdin.resume();
process.stdin.setEncoding('utf8');
process.stdin.on('data', function(chunk) {
  input += chunk;
});
process.stdin.on('end', function() {
  input = input.split('\n');
  main();
});

パチモンクリーチャー

某国で大人気のゲーム、パチモンクリーチャーが日本でリメイクされて発売されました。 ゲームが大好きなあなたは、 このゲームを何度もプレイするうちにどうしたら最速でクリアできるのか考えるようになりました。しかし、いくら考えても最速の攻略方法がわからなかったあなたは、どれだけ早くゲームをクリアできるかを求めるプログラムを作成することにしました。

ゲームの詳細は以下の通りです。

パチモンクリーチャー(以下、パチクリ)という生物が多く存在する世界がゲームの舞台です。各パチクリは、火属性、氷属性、木属性、土属性、水属性の 5 種類の属性のいずれか１つの属性を持ちます。ゲームの主人公は、ゲーム開始時に好きな属性のパチクリ一匹を冒険のパートナーとして選びます。そのパチクリと共にゴールを目指し、ゴールにいるライバルを倒してパチクリマスターになることがゲームの目的です。

しかし、ライバルを倒すためには全属性のパチクリがいないと勝てないので、途中で全属性のパチクリを捕まえなければなりません。パチクリを捕まえるには属性がカギとなります。火属性のパチクリは氷属性のパチクリを捕まえることができ、同様に、氷属性は木属性、木属性は土属性、土属性は水属性、水属性は火属性を捕まえることができます。属性の関連は以下の図のようになります。

以下の図はゲームが行われるマップの一例を表しています。

主人公はパチクリを一匹もってスタート地点である「S」から出発し、一マスずつ移動しながらゴール地点である「G」を目指します。その途中で、最初に持っているパチクリ以外の 4 つの属性のパチクリを捕まえ、ゴール地点であるマス目に移動するとゲーム終了となります。

主人公は、今いるマス目から、辺を共有する隣のマス目に移動することができ、それを一回の移動と数えます。主人公がパチクリのいるマスに移動した場合、そのパチクリを捕まえられる属性のパチクリを持っていればそのパチクリを捕まえたことになります。そのマスにいるパチクリを捕まえられるかの可否にかかわらず、すべてのマスに何度でも移動することができます。

マップの大きさ(横方向の列数、縦方向の行数)とマップの初期状態を入力とし、初めに選んだパチクリの属性と、それ以外の 4 つの属性のパチクリを捕まえるのにかかる、スタート地点からゴール地点に至る最小移動数を出力するプログラムを作成してください。

Input

複数のデータセットの並びが入力として与えられます。入力の終りはゼロふたつの行で示されます。各データセットは以下の形式で与えられます。

W H
c11c12...c1W
c21c22...c2W
:
cH1cH2...cHW

1 行目にマップの横方向の列数 W と縦方向の行数 H (2 ≤ W, H ≤ 1000) が与えられます。続く H 行にマップの i 行目の情報が与えられます。入力されるマップには各マスの状態が与えられます。 「S」は主人公のスタート地点を、 「G」はゴール地点を、「1」「2」「3」「4」「5」はそこにいるパチクリの属性を( 1:火属性、 2:氷属性、 3:木属性、 4:土属性、 5:水属性 をそれぞれ表します)、 「.(ピリオド) 」は何もないマスをそれぞれ表します。
各属性のパチクリの数はそれぞれ 0 以上 1000 以下とします。

データセットの数は140 を超えません。また、データセットの 80 % について、W, H は100 を超えません。

Output

入力データセットごとに、最初に選んだパチクリの属性と最小移動数を１行に出力します。なお、どのように初めのパチクリを選んでも、どのような経路で移動してもそれら 4 つの属性のパチクリを捕まえることができない場合は NA と出力してください。 また、最小移動数が同じになるような最初のパチクリの選び方が複数ある場合は、属性の数字が小さいものを出力してください。

Sample Input

6 6
S.1..4
3..5..
..4.1.
4....5
.2.32.
5.1..G
3 2
...
S.G
0 0

Output for the Sample Input

2 10
NA


function main(){
  var i = 0;
  while(true){
    var fieldInfo = input[i].split(' ');
    var width = fieldInfo[0] - 0;//toInt
    var height = fieldInfo[1] - 0;//toInt

    // 0 0が入力された
    if(!width && !height){
      break;
    }

    var start;
    var goal;
    var elem = [[],[],[],[],[]];

    var y = height;
    for(; y--;){
      i++;//1行進める
      var x = width;
      for(;x--;){
        var c = input[i][x];

        switch(c){
        case '.':// ドットが一番多いから先にひっかけよう
          break;
        case 'S':
          start = pos(x, y);
          break;
        case 'G':
          goal = pos(x, y);
          break;
        default : // 入力値が正しいので、絶対に属性
          elem[c - 1][elem[c - 1].length] = pos(x, y);
          break;
        }
      }
    }

    var INF = 1 << 30;
    var bestElement = -1;
    var distance = INF;

    // 属性ごとにループ
    for (var startElem = 0; startElem < 5; startElem++) {
      // DPの初期化 DP[属性][同じ属性内の連番]
      var dp = [[],[],[],[],[]];
      for(var h = 0; h < 5; h++){
        var hLength = elem[h].length;
        dp[h].length = hLength;
        for(var hidx = 0; hidx < hLength; hidx++){
          dp[h][hidx] = INF;
        }
      }

      // 最初に選んだパチモンから次に捕まえられる属性番号
      var first = (startElem + 1) % 5;

      var firstLength = elem[first].length;
      for (var j = 0; j < firstLength; j++) {
        // s→e1を計算
        dp[first][j] = dist(start, elem[first][j]);
      }

      // s->1->2->3->4->g
      // なので、ループは間の-> * 3分まわす
      for (var e = 0; e < 3; e++) {
        // ex->e(x+1)
        var now = (first + e) % 5;
        var next = (now + 1) % 5;
        var nowLength = elem[now].length;
        var nextLength = elem[next].length;
        for (var j = 0; j < nowLength; j++) {
          for (var k = 0; k < nextLength; k++) {
            dp[next][k] = fmin(
              dp[next][k],
              dp[now][j] +
                  dist(elem[now][j], elem[next][k]));
          }
        }
      }

      var last = (first + 3) % 5;
      var lastLength = elem[last].length;
      for (var j = 0; j < lastLength; j++) {
        // e4->g
        var d = dp[last][j] +
                    dist(elem[last][j], goal);

        if (d < distance) {
          distance = d;
          bestElement = startElem + 1;
        }

      }

    }

    if (distance == INF) {
      console.log("NA");
    } else {
      console.log(bestElement + " " + distance);
    }

    i++;
  }

}

function dist(from, to){
  // x座標とy座標の切り出し(11ビット右シフトでxを、2047(下位10ビット1)とのAND演算でyを取り出す)
  return fabs((from >> 11) - (to >> 11)) + fabs((from & 2047) - (to & 2047));
}

function fmin(a, b){
  // ビット演算で高速化
  var t = a - b;
 return b + (t & (t >> 31));
}

function pos(a, b){
  // 2^10 = 1024なので、下位10ビットでy座標を、上位ビットでx座標を表す
  return (a << 11) + b;
}

function fabs(a){
 // ビット演算で高速化
 var mask = a >> 31;
 return (a ^ mask) - mask;
}

var
input = '';

process.stdin.resume();
process.stdin.setEncoding('utf8');
process.stdin.on('data', function(chunk) {
  input += chunk;
});
process.stdin.on('end', function() {
  input = input.split('\n');
  main();
});


function main(){
  var i = 0;
  while(true){
    var fieldInfo = input[i].split(' ');
    var width = fieldInfo[0] - 0;//toInt
    var height = fieldInfo[1] - 0;//toInt

    // 0 0が入力された
    if(!width && !height){
      break;
    }

    var start;
    var goal;
    var elem = [[],[],[],[],[]];

    var c;
    for(var y = height; y--;){
      i++;//1行進める
      var ni = input[i];
      for(var x = 0; x < width; x++){// なぜか順列アクセスの方が早い
        c = ni[x];

        if(c === '.'){
          // ドットが一番多いはずなので、先にひっかけてしまう
        }else if(c === '1' || c === '2' || c === '3' || c === '4' || c === '5'){
          // 次に多いはずの属性を潰す
          // FIXME:判定条件は最適化できそう
          var e = elem[c - 1];
          e[e.length] = pos(x, y);
        }else if(c === 'S'){
          start = pos(x, y);
        }else{
          goal = pos(x, y);
        }

      }
    }

    var INF = 1 << 30;
    var bestElement = -1;
    var distance = INF;

    // 属性ごとにループ
    for (var startElem = 0; startElem < 5; startElem++) {
      // DPの初期化 DP[属性][同じ属性内の連番]
      var dp = [[],[],[],[],[]];
      for(var h = 0; h < 5; h++){
        var hLength = elem[h].length;
        dp[h].length = hLength;
        for(var hidx = 0; hidx < hLength; hidx++){
          dp[h][hidx] = INF;// ここでは配列キャッシュしないほうが早い
        }
      }

      // 最初に選んだパチモンから次に捕まえられる属性番号
      var first = (startElem + 1) % 5;

      var firstLength = elem[first].length;
      var dpf = dp[first];
      var elemf = elem[first];
      for (var j = 0; j < firstLength; j++) {
        // s→e1を計算
        dpf[j] = dist(start, elemf[j]);
      }

      // s->1->2->3->4->g
      // なので、ループは間の-> * 3分まわす
      for (var e = 0; e < 3; e++) {
        // ex->e(x+1)
        var now = (first + e) % 5;
        var next = (now + 1) % 5;
        var dpnw = dp[now];
        var dpnx = dp[next];
        var elnw = elem[now];
        var elnx = elem[next];
        var nowLength = elnw.length;
        var nextLength = elnx.length;
        for (var j = 0; j < nowLength; j++) {
          var dpnwj = dpnw[j];
          var elnwj = elnw[j];
          for (var k = 0; k < nextLength; k++) {
            var dpnxk = dpnx[k];
            dpnxk = fmin(
              dpnxk,
              dpnwj +
                  dist(elnwj, elnx[k]));
          }
        }
      }

      var last = (first + 3) % 5;
      var lastLength = elem[last].length;
      var dpl = dp[last];
      var ell = elem[last];
      for (var j = 0; j < lastLength; j++) {
        // e4->g
        var d = dpl[j] +
                    dist(ell[j], goal);

        if (d < distance) {
          distance = d;
          bestElement = startElem + 1;
        }

      }

    }

    if (distance == INF) {
      console.log("NA");
    } else {
      console.log(bestElement + " " + distance);
    }

    i++;
  }

}

function dist(from, to){
  // x座標とy座標の切り出し(11ビット右シフトでxを、2047(下位10ビット1)とのAND演算でyを取り出す)
  return fabs((from >> 11) - (to >> 11)) + fabs((from & 2047) - (to & 2047));
}

function fmin(a, b){
  // ビット演算で高速化
  var t = a - b;
 return b + (t & (t >> 31));
}

function pos(a, b){
  // 2^10 = 1024なので、下位10ビットでy座標を、上位ビットでx座標を表す
  return (a << 11) + b;
}

function fabs(a){
 // ビット演算で高速化
 var mask = a >> 31;
 return (a ^ mask) - mask;
}

var
input = '';

process.stdin.resume();
process.stdin.setEncoding('utf8');
process.stdin.on('data', function(chunk) {
  input += chunk;
});
process.stdin.on('end', function() {
  input = input.split('\n');
  main();
});


// 標準入力
var fs = require('fs'),
    length = fs.fstatSync(process.stdin.fd).size,
    buffer = new Buffer(length),
    bytesRead = fs.readSync(process.stdin.fd, buffer, 0, length, 0),
    input = buffer.toString('utf8', 0, bytesRead).split('\n');
main();

// ここから
function main(){
  var readLines = 0;
  while(true){
    var fieldInfo = input[readLines].split(' ');
    var width = fieldInfo[0] - 0;//toInt
    var height = fieldInfo[1] - 0;//toInt

    // 0 0が入力された
    if(!width && !height){
      break;
    }

    // 変数宣言纏めたら早い？
    var start;
    var goal;
    var elem = [[],[],[],[],[]]; // 場にいるパチモン[属性][属性内連番]
    var c;
    var rowData;
    var elemCache;
    var y;
    var x;

    for(y = height; y--;){// reverse loop
      readLines++;//1行進める
      rowData = input[readLines];
      for(x = width; x--;){// reverse loop
        c = rowData[x];

        if(c == '.'){
          // ドットが一番多いはずなので、先にひっかけてしまう
        }else if(c == '1' || c == '2' || c == '3' || c == '4' || c == '5'){
          // 次に多いはずの属性を潰す
          elemCache = elem[c - 1];
          elemCache[elemCache.length] = pos(x, y);
        }else if(c == 'S'){
          start = pos(x, y);
        }else{
          goal = pos(x, y);
        }

      }
    }

    // ブロックスコープが無いから変数宣言をまとめる
    var INF = 1 << 30;
    var bestElement = -1;
    var currentDisance;
    var nearestDistance = INF;
    var dp; // 距離[属性][同じ属性内の連番]
    var i; // loop index
    var j;
    var e;
    var len;
    var dpCacheNow; // cache of dp[i] for loop
    var dpCacheNowi; // cache of dp[now][i]
    var dpCacheNext; // cache of dp[i + 1] for loop
    var elemCacheNow;
    var elemCacheNowi; // cache of elem[now][i]
    var elemCacheNext;
    var now;
    var nowLength;
    var next;
    var nextLength;

    // 最初に選ぶ属性ごとにループ
    for (var selectElem = 0; selectElem < 5; selectElem++) {
      dp = [[],[],[],[],[]]; // 距離[属性][同じ属性内の連番]

      for(i = 5; i--;){// reverse loop
        len  = elem[i].length;
        dpCache = dp[i];
        dpCache.length = len;
        for(;len--;){// reverse loop
          dpCache[len] = INF;
        }
      }

      now = (selectElem + 1) % 5;
      nowLength = elem[now].length;
      dpCacheNow = dp[now];
      elemCacheNow= elem[now];

      for (i = 0; i < nowLength; i++) {
        // s→e1を計算
        dpCacheNow[i] = dist(start, elemCacheNow[i]);
      }

      // s->1->2->3->4->g
      // なので、ループは間の-> * 3分まわす
      for (e = 0; e < 3; e++) {
        // e(x)->e(x+1)
        next = (now + 1) % 5;
        dpCacheNext = dp[next];
        elemCacheNext = elem[next];
        nextLength = elemCacheNext.length;
        for (i = 0; i < nowLength; i++) {
          dpCacheNowi = dpCacheNow[i];
          elemCacheNowi = elemCacheNow[i];

          if(dpCacheNowi < nearestDistance){// 既に決まっている最短距離を超えたら絶対に候補ではない
            for (j = 0; j < nextLength; j++) {
              dpCacheNext[j] = min(dpCacheNext[j], dpCacheNowi + dist(elemCacheNowi, elemCacheNext[j])); // メモと新しい経路の最短
            }
          }
        }

        now = next;
        dpCacheNow = dpCacheNext;
        elemCacheNow = elemCacheNext;
        nowLength = nextLength;
      }

      for (i = 0; i < nextLength; i++) {
        // e4->g
        currentDistance = dpCacheNext[i] + dist(elemCacheNext[i], goal);

        if (currentDistance < nearestDistance) {
          nearestDistance = currentDistance;
          bestElement = selectElem;
        }

      }

    }

    if (nearestDistance == INF) {
      console.log("NA");
    } else {
      console.log((bestElement + 1) + " " + nearestDistance);
    }

    readLines++;
  }

}

function dist(from, to){
  // x座標とy座標の切り出し(12ビット右シフトでxを、4095(下位11ビット1)とのAND演算でyを取り出す)
  return abs((from - to) >> 12) + abs((from - to) & 4095);
}

function min(a, b){
  // ビット演算で高速化
 return b + ((a - b) & ((a - b) >> 31));// 変数宣言よりもこっちの方が高速
}

function pos(a, b){
  // オブジェクトのインスタンス作るよりもプリミティブの方が早い
  // 2^10 = 1024なので、下位10ビットでy座標を、上位ビットでx座標を表す
  // 計算のため、余裕をもって12ビットシフト
  return (a << 12) + b;
}

function abs(a){
 // ビット演算で高速化
 return (a ^ (a >> 31)) - (a >> 31);// これも
}


// 標準入力
var fs = require('fs'),
    length = fs.fstatSync(process.stdin.fd).size,
    buffer = new Buffer(length),
    bytesRead = fs.readSync(process.stdin.fd, buffer, 0, length, 0),
    input = buffer.toString('utf8', 0, bytesRead).split('\n');
main();

// ここから
function main(){
  var readLines = 0;
  while(true){
    var fieldInfo = input[readLines].split(' ');
    var width = fieldInfo[0] - 0;//toInt
    var height = fieldInfo[1] - 0;//toInt

    // 0 0が入力された
    if(!width && !height){
      break;
    }

    // 変数宣言纏めたら早い？
    var start;
    var goal;
    var elem = [[],[],[],[],[]]; // 場にいるパチモン[属性][属性内連番]
    var c;
    var rowData;
    var elemCache;
    var y;
    var x;

    for(y = height; y--;){// reverse loop
      readLines++;//1行進める
      rowData = input[readLines];
      for(x = width; x--;){// reverse loop
        c = rowData[x];

        if(c == '.'){
          // ドットが一番多いはずなので、先にひっかけてしまう
        }else if(c == '1' || c == '2' || c == '3' || c == '4' || c == '5'){
          // 次に多いはずの属性を潰す
          elemCache = elem[c - 1];
          elemCache[elemCache.length] = pos(x, y);
        }else if(c == 'S'){
          start = pos(x, y);
        }else{
          goal = pos(x, y);
        }

      }
    }

    // ブロックスコープが無いから変数宣言をまとめる
    var INF = 1 << 30;
    var bestElement = -1;
    var currentDisance;
    var nearestDistance = INF;
    var dp; // 距離[属性][同じ属性内の連番]
    var i; // loop index
    var j;
    var e;
    var len;
    var dpCacheNow; // cache of dp[i] for loop
    var dpCacheNowi; // cache of dp[now][i]
    var dpCacheNext; // cache of dp[i + 1] for loop
    var elemCacheNow;
    var elemCacheNowi; // cache of elem[now][i]
    var elemCacheNext;
    var now;
    var nowLength;
    var next;
    var nextLength;

    // 最初に選ぶ属性ごとにループ
    for (var selectElem = 0; selectElem < 5; selectElem++) {
      dp = [[],[],[],[],[]]; // 距離[属性][同じ属性内の連番]

      for(i = 5; i--;){// reverse loop
        len  = elem[i].length;
        dp[i].length = len;
        dpCache = dp[i];
        while(len--){// reverse loop
          dpCache[len] = INF;
        }
      }

      now = (selectElem + 1) % 5;
      nowLength = elem[now].length;
      dpCacheNow = dp[now];
      elemCacheNow= elem[now];

      for (i = 0; i < nowLength; i++) {
        // s→e1を計算
        dpCacheNow[i] = dist(start, elemCacheNow[i]);
      }

      // s->1->2->3->4->g
      // なので、ループは間の-> * 3分まわす
      for (e = 0; e < 3; e++) {
        // e(x)->e(x+1)
        next = (now + 1) % 5;
        dpCacheNext = dp[next];
        elemCacheNext = elem[next];
        nextLength = elemCacheNext.length;
        for (i = 0; i < nowLength; i++) {
          dpCacheNowi = dpCacheNow[i];
          elemCacheNowi = elemCacheNow[i];

          if(dpCacheNowi >= nearestDistance){
            // 既に決まっている最短距離を超えたら絶対に候補ではない
            continue;
          }

          for (j = 0; j < nextLength; j++) {
            dpCacheNext[j] = min(dpCacheNext[j], dpCacheNowi + dist(elemCacheNowi, elemCacheNext[j])); // メモと新しい経路の最短
          }
        }

        now = next;
        dpCacheNow = dpCacheNext;
        elemCacheNow = elemCacheNext;
        nowLength = nextLength;
      }

      for (i = 0; i < nextLength; i++) {
        // e4->g
        currentDistance = dpCacheNext[i] + dist(elemCacheNext[i], goal);

        if (currentDistance < nearestDistance) {
          nearestDistance = currentDistance;
          bestElement = selectElem;
        }

      }

    }

    if (nearestDistance == INF) {
      console.log("NA");
    } else {
      console.log((bestElement + 1) + " " + nearestDistance);
    }

    readLines++;
  }

}

function dist(from, to){
  // x座標とy座標の切り出し(11ビット右シフトでxを、2047(下位10ビット1)とのAND演算でyを取り出す)
  return abs((from >> 11) - (to >> 11)) + abs((from & 2047) - (to & 2047));
}

function min(a, b){
  // ビット演算で高速化
 return b + ((a - b) & ((a - b) >> 31));// 変数宣言よりもこっちの方が高速
}

function pos(a, b){
  // オブジェクトのインスタンス作るよりもプリミティブの方が早い
  // 2^10 = 1024なので、下位10ビットでy座標を、上位ビットでx座標を表す
  return (a << 11) + b;
}

function abs(a){
  // ビット演算で高速化
  var t = a >> 31;
  return (a ^ t) - t;
}


// 標準入力
var fs = require('fs'),
length = fs.fstatSync(process.stdin.fd).size,
buffer = new Buffer(length),
bytesRead = fs.readSync(process.stdin.fd, buffer, 0, length, 0),
input = buffer.toString('utf8', 0, bytesRead).split('\n');
main();

// ここから
function main(){
  var readLines = 0;
  while(true){
    var fieldInfo = input[readLines].split(' ');
    var width = fieldInfo[0] - 0;//toInt
    var height = fieldInfo[1] - 0;//toInt

    // 0 0が入力された
    if(!width && !height){
      break;
    }

    // 変数宣言纏めたら早い
    var start;
    var goal;
    // 数値計算なのでTypedArray採用で高速化
    var elem = [new Int32Array(), new Int32Array(), new Int32Array(), new Int32Array(), new Int32Array()]; // 場にいるパチモン[属性][属性内連番]
    var c;
    var rowData;
    var elemCache;
    var y;
    var x;

    for(y = height; y--;){// reverse loop
      readLines++;//1行進める
      rowData = input[readLines];
      for(x = width; x--;){// reverse loop
        c = rowData[x];

        if(c == '.'){
          // ドットが一番多いはずなので、先にひっかけてしまう
        }else if(c == '1' || c == '2' || c == '3' || c == '4' || c == '5'){
          // 次に多いはずの属性を潰す
          elemCache = elem[c - 1];
          elemCache[elemCache.length] = pos(x, y);
        }else if(c == 'S'){
          start = pos(x, y);
        }else{
          goal = pos(x, y);
        }

      }
    }

    // ブロックスコープが無いから変数宣言をまとめる
    var INF = 1 << 30;
    var bestElement = -1;
    var currentDisance;
    var nearestDistance = INF;
    var dp; // 距離[属性][同じ属性内の連番]
    var i; // loop index
    var j;
    var e;
    var len;
    var dpCacheNow; // cache of dp[i] for loop
    var dpCacheNowi; // cache of dp[now][i]
    var dpCacheNext; // cache of dp[i + 1] for loop
    var elemCacheNow;
    var elemCacheNowi; // cache of elem[now][i]
    var elemCacheNext;
    var now;
    var nowLength;
    var next;
    var nextLength;

    // 最初に選ぶ属性ごとにループ
    for (var selectElem = 0; selectElem < 5; selectElem++) {
      dp = new Array(5); // 距離[属性][同じ属性内の連番]

      for(i = 5; i--;){// reverse loop
        len  = elem[i].length;
        // ここもTypedArray採用
        dpCache = dp[i] = new Int32Array(len);

        while(len--){// reverse loop
          dpCache[len] = INF;
        }
      }

      now = (selectElem + 1) % 5;
      nowLength = elem[now].length;
      dpCacheNow = dp[now];
      elemCacheNow= elem[now];

      for (i = 0; i < nowLength; i++) {
        // s→e1を計算
        dpCacheNow[i] = dist(start, elemCacheNow[i]);
      }

      // s->1->2->3->4->g
      // なので、ループは間の-> * 3分まわす
      for (e = 0; e < 3; e++) {
        // e(x)->e(x+1)
        next = (now + 1) % 5;
        dpCacheNext = dp[next];
        elemCacheNext = elem[next];
        nextLength = elemCacheNext.length;
        for (i = 0; i < nowLength; i++) {
          dpCacheNowi = dpCacheNow[i];
          elemCacheNowi = elemCacheNow[i];

          if(dpCacheNowi >= nearestDistance){
            // 既に決まっている最短距離を超えたら絶対に候補ではない
            continue;
          }

          for (j = 0; j < nextLength; j++) {
            dpCacheNext[j] = min(dpCacheNext[j], dpCacheNowi + dist(elemCacheNowi, elemCacheNext[j])); // メモと新しい経路の最短
          }
        }

        now = next;
        dpCacheNow = dpCacheNext;
        elemCacheNow = elemCacheNext;
        nowLength = nextLength;
      }

      for (i = 0; i < nextLength; i++) {
        // e4->g
        currentDistance = dpCacheNext[i] + dist(elemCacheNext[i], goal);

        if (currentDistance < nearestDistance) {
          nearestDistance = currentDistance;
          bestElement = selectElem;
        }

      }

    }

    if (nearestDistance == INF) {
      console.log("NA");
    } else {
      console.log((bestElement + 1) + " " + nearestDistance);
    }

    readLines++;
  }

}

function dist(from, to){
  // x座標とy座標の切り出し(11ビット右シフトでxを、2047(下位10ビット1)とのAND演算でyを取り出す)
  return abs((from >> 11) - (to >> 11)) + abs((from & 2047) - (to & 2047));
}

function min(a, b){
  // ビット演算で高速化
  return b + ((a - b) & ((a - b) >> 31));// 変数宣言よりもこっちの方が高速
}

function pos(a, b){
  // オブジェクトのインスタンス作るよりもプリミティブの方が早い
  // 2^10 = 1024なので、下位10ビットでy座標を、上位ビットでx座標を表す
  return (a << 11) + b;
}

function abs(a){
  // ビット演算で高速化
  return (a ^ (a >> 31)) - (a >> 31);// これも
}


var input = require('fs').readFileSync('/dev/stdin', 'utf8');
var arr=input.trim().split("\n");
while(true){
   var mn=arr.shift().split(" ");
   if(mn.join(" ")=="0 0")break;
   var m=mn[0]-0;
   var n=mn[1]-0;
   var p=[];
   for(var i=0;i<m;i++)p[i]=i+1;
   var i=0;
   var j=0;
   var good="";
   while(n--){
      i++;
      var str=arr.shift();
      if(i%15==0)good="FizzBuzz";
      else if(i%3==0)good="Fizz";
      else if(i%5==0)good="Buzz";
      else good=i+"";
      if(str!=good){
         p.splice(j,1);
         if(p.length==1)break;
      }
      j++;
      if(j>=m)j=0;
   }
   console.log(p.join(" "));
}

FizzBuzz

「Fizz Buzz」と言われる数字を使ったゲームがあります。このゲームは複数のプレイヤーで数字を1 から順にひとつずつ数え上げていくもので、各プレイヤーは直前のプレイヤーが発言した次の数字をひとつだけ発言します。その時、3 で割り切れる場合は 「Fizz」, 5 で割り切れる場合は 「Buzz」、両者で割り切れる場合は「FizzBuzz」と数の代わりに発言しなければなりません。例えば、最初の 16 までの発言は以下のようになります。

1, 2, Fizz, 4, Buzz, Fizz, 7, 8, Fizz, Buzz, 11, Fizz, 13, 14, FizzBuzz, 16, ・・・

太郎君は友達と「Fizz Buzz」をして遊ぶことにしました。太郎君たちはルールを次のように決めました。

「間違えた人は脱落する。その次の人は間違えた数の次の数から始める。つまり、1, 2, 3 と発言した場合、3 で間違えたので次は 4 から始めることになる。」

このルールに従ってゲームを行うのですが、ゲームに慣れていないため、間違えたことに気付かないことがあり、公平な判断ができません。そこであなたは太郎君たちがこのゲームを楽しめるように、決められた発言回数が終わった時点で残っていた人を出力するプログラムを作成することにしました。

プレイヤー数、ゲーム中に発言された回数、それぞれの発言を入力とし、入力が終わった時点で残っているプレイヤーの番号を小さい順に出力するプログラムを作成してください。ただし、プレイヤーには 1 から番号が割り振られており、発言順番も 1 番目のプレイヤーから順に行い、一通り発言が終わると、再度 1 番目のプレイヤーから発言することとします。順番の回ってきたプレイヤーが既に脱落している場合は、その次のプレイヤーが発言します。また、このプログラムは、プレイヤーが一人になった時点で、その後の発言を無視しなければなりません。

Input

複数のデータセットの並びが入力として与えられます。入力の終わりはゼロふたつの行で示されます。
各データセットは以下の形式で与えられます。

m n
s1
s2
:
sn

1 行目にプレイヤー数 m (2 ≤ m ≤ 1000) と発言回数 n (1 ≤ n ≤ 10000) が与えられます。

続く n 行に i 番目の発言 s1 が与えられます。 si は整数、Fizz、Buzz、または FizzBuzz を示す文字列（8文字以下）です。

データセットの数は 50 を超えません。

Output

入力データセットごとに、指定された発言回数まで入力されたときに残っているプレイヤーの番号を小さい順に出力します。

Sample Input

5 7
1
2
Fizz
4
Buzz
6
7
3 5
1
2
3
4
5
0 0

Output for the Sample Input

2 3 4 5
1


var input = require('fs').readFileSync('/dev/stdin', 'utf8');
var Arr=(input.trim()).split("\n");
while(true){
   var n=Arr.shift();
   if(n=="0000")break;
   if(n=="1111" || n=="2222" || n=="3333" || n=="4444" || n=="5555"){console.log("NA");continue;}
   if(n=="6666" || n=="7777" || n=="8888" || n=="9999"){console.log("NA");continue;}
   var i=0;
   while(true){
      if(n=="6174")break;
      i++;
      var arr=n.split("").map(Number);
      arr.sort(function(a,b){return b-a;});
      var L=parseInt(""+arr[0]+arr[1]+arr[2]+arr[3],10);
      var S=parseInt(""+arr[3]+arr[2]+arr[1]+arr[0],10);
      n=("0000"+(L-S)).slice(-4);
   }
   console.log(i);
}

すべての数は６１７４に通ず

0 から 9 の数字からなる四桁の数 N に対して以下の操作を行う。

N の桁それぞれの数値を大きい順に並べた結果得た数を L とする

N の桁それぞれの数値を小さい順に並べた結果得た数を S とする

差 L-S を新しい N とする(1回分の操作終了)

新しい N に対して 1. から繰り返す

このとき、全桁が同じ数字(0000, 1111など)である場合を除き、あらゆる四桁の数はいつかは 6174になることが知られている。例えば N = 2012の場合

       1回目 (N = 2012): L = 2210, S = 0122, L-S = 2088

       2回目 (N = 2088): L = 8820, S = 0288, L-S = 8532

       3回目 (N = 8532): L = 8532, S = 2358, L-S = 6174

となり、3 回の操作で 6174 に到達する。

0 から 9 の数字からなる四桁の数が与えられたとき、何回の操作で 6174 に到達するか計算するプログラムを作成して下さい。

入力

入力は複数のデータセットからなる。入力の終わりは 0000 が１つの行で示される。各データセットは以下の形式で与えられる。

N

データセットは１行であり、N (1 ≤ N ≤ 9999) は四桁の数を示す。N < 1000 の場合は上の桁は 0 で埋められている。

データセットの数は 10000 を超えない。

出力

各データセットごとに何回の操作で 6174 に到達したかを１行に出力する。ただし全桁が同じ数字である数が入力として与えられた場合は NA と出力する。

入力例

6174
2012
3333
0000

出力例

0
3
NA


Main(function(input) {
	input = input.trim().split('\n');
	input.shift();
	input.forEach(function(line) {
		var tmp = line.split(' ');
		var c = +tmp[0];
		var a = +tmp[1];
		var n = +tmp[2];
		var ans = 0;
		var min;

		/**
		 * CAN pattern
		 */
		min = Math.min(c, a, n);
		c -= min;
		a -= min;
		n -= min;
		ans += min;

		/**
		 * CCA pattern
		 */
		min = Math.min(Math.floor(c / 2), a);
		c -= min * 2;
		a -= min;
		ans += min;

		/**
		 * CCC pattern
		 */
		ans += Math.floor(c / 3);

		console.log(ans);
	});
});

function Main(main) {
	var input = '';

	process.stdin.resume();
	process.stdin.setEncoding('utf8');
	process.stdin.on('data', function(chunk) {
		input += chunk;
	});
	process.stdin.on('end', function() {
		main(input);
	});
};

陣形

プログラマー養成校であるアカベ高校では、チーム戦の競技プログラマーの役割を以下の３タイプに分けています。

Ｃ：

コーダー

言語を熟知しており、コーディングを行う。

Ａ：

アルゴリズマー

論理的思考が得意であり、アルゴリズムを考える。

Ｎ：

ナビゲーター

読解力に長けており、問題の分析・デバッグをする。

この高校では以下のいずれかの陣形で３人一組のチームを構成しています。

ＣＣＡ：

バランスがとれている安定型

ＣＣＣ：

スピードを見込めるがリスクの高い速攻型

ＣＡＮ：

正確に問題を解く慎重型

競技プログラミング部のコーチであるあなたは、これらの部員をうまく組み合わせ、できるだけ多くのチームを結成できるよう、毎年気を配っています。そこで、コーダーの人数、アルゴリズマーの人数、ナビゲーターの人数が入力として与えられたとき、最大何チーム作れるかを出力するプログラムを作成してください。

入力

入力は1つのデータセットからなる。入力データは以下の形式で与えられる。

Q
c1 a1 n1
c2 a2 n2
:
cQ aQ nQ

1行目のQ(0 ≤ Q ≤ 100)はチーム数を求めたい年数である。続くQ行に各年の役割別の人数が与えられる。各行にはコーダーの人数ci(0 ≤ ci ≤ 1000)、アルゴリズマーの人数ai(0 ≤ ai ≤ 1000)、ナビゲーターの人数ni(0 ≤ ni ≤ 1000)が与えられる。

出力

年ごとに、作成できる最大のチーム数を1行に出力する。

入力例

4
3 0 0
1 1 1
9 4 1
0 1 2

出力例

1
1
4
0


var input = require('fs').readFileSync('/dev/stdin', 'utf8');
var arr=input.trim().split("\n");
while(true){
   var mn=arr.shift();
   if(mn=="0 0")break;
   mn=mn.split(" ").map(Number);
   var m=mn[0];
   var n=mn[1];
   var ary=[];
   for(var i=0;i<18;i++)ary[i]=0;
   ary[0]=m;
   for(var j=1;j<=n;j++){
      if(j==n)m=1;
      var plus=[];
      for(var i=0;i<18;i++)plus[i]=0;
      ary.forEach(function(v,i){
         var k=v*m;
         if(k>=10000){
            ary[i]=k%10000;
            plus[i+1]+=Math.floor(k/10000);
         }else{
            ary[i]=k;
         }
      });
      ary.forEach(function(v,i){
         ary[i]=ary[i]+plus[i];
      });
   }
   var us=["","Man","Oku","Cho","Kei","Gai","Jo","Jou","Ko","Kan","Sei","Sai","Gok","Ggs","Asg","Nyt","Fks","Mts"];
   var str="";
   ary.forEach(function(v,i){
      if(v!=0)str=v+us[i]+str;
   });
   if(str=="")str=0;
   console.log(str);
}

塵劫記

大きな数を表そうとすると、文字数も多くなるし、位取りがわからなくなってしまうので、なかなか面倒です。大きな数をわかりやすく表すために、人々は数の単位を使ってきました。江戸時代に書かれた「塵劫記」という本の中では、数の単位が次のように書かれています。

たとえば、２の１００乗のようなとても大きな数は、１２６穣７６５０(じょ)６００２垓２８２２京９４０１兆４９６７億３２０万５３７６と表せます。それでは、正の整数 m と n が与えられたとき、m の n 乗を塵劫記の単位を使って上のように表すプログラムを作成してください。

入力

入力は複数のデータセットからなる。入力の終わりはゼロ２つの行で示される。各データセットは以下の形式で与えられる。

m n

m (2 ≤ m ≤ 20) が基数、n (1 ≤ n < 240) が指数を表す。ただし、mnは 1072 未満である。

データセットの数は 100 を超えない。

出力

データセットごとに、mn を塵劫記の単位で表した文字列を1行に出力する。ただし、各単位は以下の表記で出力する。

mnを表す文字列は、1 から 9999 までの数と上の表に現れる単位を表す文字列からなる。文字列には、余分な 0 や単位を含めない。

入出力例

入力例

2 10
5 20
10 8
20 17
0 0

出力例

1024
95Cho3674Oku3164Man625
1Oku
131Gai720Kei


var input = require('fs').readFileSync('/dev/stdin', 'utf8');
var Arr=(input.trim()).split("\n").map(Number);
for(var i=0;i<Arr.length;i++){
var v=Arr[i];
var sum=0;
if(v==0)break;
v=1000-v;
if(v>=500){sum++;v=v-500;}
sum+=Math.floor(v/100);
v=v%100;
if(v>=50){sum++;v=v-50;}
sum+=Math.floor(v/10);
v=v%10;
if(v>=5){sum++;v=v-5;}
console.log(sum+v);
}

おつり

問題

太郎君はよくJOI雑貨店で買い物をする． JOI雑貨店には硬貨は500円，100円，50円，10円，5円，1円が十分な数だけあり，いつも最も枚数が少なくなるようなおつりの支払い方をする．太郎君がJOI雑貨店で買い物をしてレジで1000円札を1枚出した時，もらうおつりに含まれる硬貨の枚数を求めるプログラムを作成せよ．

例えば入力例1の場合は下の図に示すように，4を出力しなければならない．

入力

入力は複数のデータセットからなる．各データセットは1行からなり，太郎君が支払う金額（1以上1000未満の整数）が1つだけ書かれている．入力データはゼロ１つの行で終了する．

データセットの数は 5 を超えない．

出力

データセットごとにおつりに含まれる硬貨の枚数を1行に出力せよ．

入出力例

入力例

380
1
0

出力例

4
15

上記問題文と自動審判に使われるデータは、情報オリンピック日本委員会が作成し公開している問題文と採点用テストデータです。


var input = require('fs').readFileSync('/dev/stdin', 'utf8');
var arr=input.trim().split("\n");

while(true){
   var last=[];
   var nm=arr.shift().split(" ").map(Number);
   if(nm.join(" ")=="0 0")break;
   var n=nm[0];
   var m=nm[1];
   var yx=[];
   for(var i=0;i<n;i++){
      var ary=arr.shift().split(" ").map(Number);
      var d=ary.shift();
      var data=[];
      while(d--)data.push([ary.shift(),ary.shift()]);
      yx.push(data);
   }
   var dp=[];
   for(var i=0;i<=n;i++){
      dp[i]=[];
      for(var j=0;j<=1000;j++){
         dp[i][j]=[];
         for(var k=0;k<=m;k++){
            dp[i][j][k]=Infinity;
         }
      }
   }
   yx[0].forEach(function(v){
      var x=v[0];
      dp[0][x][0]=0;
   });
   yx[1].forEach(function(v){
      var x=v[0];
      dp[1][x][1]=0;
   });
   for(var i=1;i<n;i++){
      yx[i].forEach(function(v,index){
         var x=v[0];
         var value=v[1];
         yx[i-1].forEach(function(V,INDEX){
            var X=V[0];
            var VALUE=V[1];
            for(var j=0;j<=m;j++){
               dp[i][x][j]=Math.min(dp[i][x][j],dp[i-1][X][j]+(value+VALUE)*Math.abs(x-X));
            }
         });
      });
      if(i==n-1){
      yx[i].forEach(function(v,index){
         var x=v[0];
         var value=v[1];
         yx[i-1].forEach(function(V,INDEX){
            var X=V[0];
            var VALUE=V[1];
            for(var j=0;j<m;j++){
               dp[i][x][j]=Math.min(dp[i][x][j],dp[i-1][X][j]);
            }
         });
      });
      }
      if(i!=n-1){
      yx[i+1].forEach(function(v,index){
         var x=v[0];
         var value=v[1];
         yx[i-1].forEach(function(V,INDEX){
            var X=V[0];
            var VALUE=V[1];
            for(var j=0;j<m;j++){
               dp[i+1][x][j+1]=Math.min(dp[i+1][x][j+1],dp[i-1][X][j]+(value+VALUE)*Math.abs(x-X));
            }
         });
      });
      }

      if(i==n-1 && yx[i].length==0){
         var x=0;
         var value=0;
         yx[i-1].forEach(function(V,INDEX){
            var X=V[0];
            var VALUE=V[1];
            for(var j=0;j<m;j++){
               last.push(dp[i-1][X][j]);
            }
         });
      }
   }
   var min=Infinity;
   yx[n-1].forEach(function(v){
      var x=v[0];
      for(var j=0;j<=m;j++){
         min=Math.min(min,dp[n-1][x][j]);
      }
   });
   if(min==Infinity){
      last.forEach(function(v){
         min=Math.min(min,v);
      });
   }
   console.log(min);
}

ぴょんぴょん川渡り

問題

ある川で,一方の岸から石の上を次々と飛び移って反対側の岸まで行くという少々危険なゲームがはやっている.

今,図 4-1 のように,石はマス目の上に存在すると考える.行の数は n である. 図 4-1 では n = 5 である.

このゲームでは,一方の岸から始めて,通常のジャンプまたは m 回以下の一行飛ばしのジャンプをして反対側の岸まで渡る.通常のジャンプとは,今いる行の一つ先の行の岸または石のどれかに飛び移ることであり,一行飛ばしのジャンプとは,今いる行の二つ先の行の岸または石のどれかに飛び移ることである.始める岸の一つ先の行は 1 行目,二つ先の行は 2 行目であり,n − 1 行目の二つ先の行,及び n 行目の一つ先の行は反対側の岸であるとする.

さて,このゲームをできるだけ安全に成し遂げるために,ジャンプの危険度というものを考えることにした.それぞれの石には,滑りやすさが定まっている.石から石へ飛び移る際のジャンプの危険度は,通常のジャンプであっても,一行飛ばしのジャンプであっても,

(今いる石の滑りやすさ + 飛び移る先の石の滑りやすさ)×(横の移動距離)

で定める.ただし,横の移動距離とは,列の番号の差である.また,岸から石へ,あるいは石から岸へ飛び移るジャンプの危険度は 0 とする.

入力として n, m,それぞれの石の位置と滑りやすさが与えられたとき,反対側の岸まで到達する際のジャンプの危険度の合計の最小値を求めるプログラムを作成せよ.与えられる入力データは必ず反対側の岸まで到達することができるようになっており,同じマス目に石は 2 個以上存在しない.

入力

入力は複数のデータセットからなる．各データセットは以下の形式で与えられる．

入力の 1 行目には,空白を区切りとして 2 個の整数 n,m が書かれている.これは,行の数と,一行飛ばしのジャンプの許される回数を表す.n,m はそれぞれ 2 ≤ n ≤ 150, 0 ≤ m ≤ (n+1)/2　を満たす.

続く n 行には,それぞれの行にある石の情報が書かれている.i+1 行目 (1 ≤ i ≤ n)には,1 つの整数 ki (0 ≤ ki ≤ 10) と,それに続き 2 × ki 個の整数が空白で区切られ書かれている.これらは,始める岸から数えて i 番目の行にある石の情報を表す.

ki はその行に存在する石の個数を表し,それに続く 2 × ki 個の整数については,2 × j - 1 個目 (1 ≤ j ≤ ki ) の整数 xi,j はその行の j 個目の石の列の番号を,2 × j個目の整数 di,j はその行の j 個目の石の滑りやすさをそれぞれ表す.xi,j ,di,j はそれぞれ 1 ≤ xi,j, di,j ≤1000 を満たす.

採点用データのうち, 配点の 20% 分については, n ≤ 6 を満たし,配点の別の 20%分については, m = 0 を満たす.

n, m がともに 0 のとき入力の終了を示す. データセットの数は 10 を超えない．

出力

データセットごとに, 反対側の岸まで到達する際のジャンプの危険度の合計の最小値を表す 1 つの整数を1 行に出力する.

例

図 4-2 において,石に書かれた数字はそれぞれの石の滑りやすさを表すとする.
矢印で示された順番で石を渡るとき,それぞれのジャンプの危険度は,順番に 0,
(2 + 2) × 1 = 4,(2 + 1) × 1 = 3,(1 + 4) × 2 = 10,0 であり,合計は 17 となる.
このとき,ジャンプの危険度の合計は最小となる.
この例は１つ目の入出力例に対応している.

入出力例

入力例

5 1
2 1 3 2 2
1 3 2
1 1 7
1 2 1
1 4 4
5 0
2 1 3 2 2
1 3 2
1 1 7
1 2 1
1 4 4
0 0

出力例

17
40

上記問題文と自動審判に使われるデータは、情報オリンピック日本委員会が作成し公開している問題文と採点用テストデータです。


var input = require('fs').readFileSync('/dev/stdin', 'utf8');
var Arr=(input.trim()).split("\n");
var N=Arr.shift()-0;
var AB=(Arr.shift()).split(" ").map(Number);
var C=Arr.shift()-0;
var arr=[];
for(var i=0;i<N;i++){
   var v=Arr.shift()-0;
   arr.push(v);
}
arr.sort(function(a,b){return b-a;});
var ans=[];
var money=AB[0];
var cal=C;
for(var i=0;i<N;i++){
   money+=AB[1];
   cal+=arr[i];
   var v=cal/money;
   ans.push(v);
}
var max=Math.max.apply(null,ans);
console.log(Math.floor(max));

最高のピザ (Best Pizza)

問題

K 理事長は，JOI 市の中心部にある JOI ピザ店の常連客である．彼はある事情により，今月から節約生活を始めることにした．そこで彼は，JOI ピザ店で注文できるピザのうち，1 ドルあたりのカロリーが最大となるようなピザを注文したいと思った．このようなピザを「最高のピザ」と呼ぶことにしよう．「最高のピザ」は 1 種類とは限らない．

JOI ピザでは N 種類のトッピングから何種類かを自由に選び，基本の生地の上に載せたものを注文することができる．同種のトッピングを 2 つ以上載せることはできない．生地にトッピングを 1 種類も載せないピザも注文できる．生地の値段は A ドルであり，トッピングの値段はいずれも B ドルである．ピザの値段は，生地の値段と載せたトッピングの値段の合計である．すなわち，トッピングを k 種類 (0 ≦ k ≦ N) 載せたピザの値段は A + k × B ドルである．ピザ全体のカロリーは，生地のカロリーと載せたトッピングのカロリーの合計である．

生地の値段とトッピングの値段，および，生地と各トッピングのカロリーの値が与えられたとき，「最高のピザ」の 1 ドルあたりのカロリー数を求めるプログラムを作成せよ．

入力

入力は N + 3 行からなる．

1 行目にはトッピングの種類数を表す 1 つの整数 N (1 ≦ N ≦ 100) が書かれている．2 行目には 2 つの整数 A, B (1 ≦ A ≦ 1000，1 ≦ B ≦ 1000) が空白を区切りとして書かれている．A は生地の値段，B はトッピングの値段を表す．3 行目には，生地のカロリー数を表す 1 つの整数 C (1 ≦ C ≦ 10000) が書かれている．

3 + i 行目 (1 ≦ i ≦ N) には，i 番目のトッピングのカロリー数を表す 1 つの整数 Di (1 ≦ Di ≦ 10000) が書かれている．

出力

「最高のピザ」の 1 ドルあたりのカロリー数を 1 行で出力せよ．ただし，小数点以下は切り捨てて整数値で出力せよ．

入出力例

入力例 1

3
12 2
200
50
300
100

出力例 1

37

入出力例 1 では，2 番目と 3 番目のトッピングを載せると，200 + 300 + 100 = 600 カロリーで 12 + 2 × 2 = 16 ドルのピザになる．

このピザは 1 ドルあたり 600 / 16 = 37.5 カロリーになる．これが「最高のピザ」となるので，37.5 の小数点以下を切り捨てた 37 を出力する．

入力例 2

4
20 3
900
300
100
400
1300

出力例 2

100

問題文と自動審判に使われるデータは、情報オリンピック日本委員会が作成し公開している問題文と採点用テストデータです。


var fs = require('fs');

// class Stdin
function Stdin() {
  this.__input = null;
  this.__lines = [];
  this.__index = 0;
}
Stdin.prototype.init = function() {
  this.__input = fs.readFileSync('/dev/stdin', 'utf-8');
  this.__lines = this.__input.split("\n");
  this.__index = 0;
}
Stdin.prototype.readline = function() {
  if(this.__index === this.__lines.length) this.init();
  return this.__lines[this.__index++];
};
Stdin.prototype.readlines = function() {
  if(this.__index === this.__lines.length) this.init();
  cur = this.__index; this.__index = this.__lines.length;
  return this.__lines.slice(cur);
};
var stdin = new Stdin;

Array.prototype.imap = function() { return this.map((x)=>parseInt(x)); }
Array.prototype.fmap = function() { return this.map((x)=>parseFloat(x)); }
Array.prototype.smap = function() { return this.map((x)=>String(x)); }
Array.prototype.ffill = function(cb) {
  for(var i=0; i<this.length; ++i) { this[i] = cb(i); } return this;
}
Array.prototype.max = function(cb) {
  if(this.length === 0) return undefined;
  res = cb ? cb(this[0], 0) : this[0];
  for(var i=1; i<this.length; ++i){ var val = cb ? cb(this[i], i) : this[i]; if(res < val) res = val; }
  return res;
}
Array.prototype.min = function(cb) {
  if(this.length === 0) return undefined;
  res = cb ? cb(this[0], 0) : this[0];
  for(var i=1; i<this.length; ++i){ var val = cb ? cb(this[i], i) : this[i]; if(val < res) res = val; }
  return res;
}
Array.prototype.sum = function(cb) {
  if(this.length === 0) return undefined;
  res = cb ? cb(this[0], 0) : this[0];
  for(var i=1; i<this.length; ++i) res += cb ? cb(this[i], i) : this[i];
  return res;
}

Number.prototype.times = function(cb) { res = []; for(var i=0; i<this; ++i) res.push(cb ? cb(i) : i); return res; }

Object.prototype.forEach = function(cb) { Object.keys(this).forEach(cb); }
Object.prototype.map = function(cb) { Object.keys(this).map(cb); }

console.log((5).times(x=>stdin.readline()).imap().sum(x=>x<40?40:x)/5);

問題 1: 平均点 (Average Score)

問題

JOI 高校の授業には，太郎君，次郎君，三郎君，四郎君，花子さんの 5 人の生徒が参加した．

この授業では，期末試験を実施した．期末試験は，5 人全員が受験した．期末試験の点数が 40 点以上の生徒は，期末試験の点数がそのまま成績になった．期末試験の点数が 40 点未満の生徒は全員，補習を受け，成績が 40 点になった．

5 人の生徒の期末試験の点数が与えられたとき，5 人の成績の平均点を計算するプログラムを作成せよ．

入力

入力は 5 行からなり，1 行に 1 つずつ整数が書かれている．

1 行目には 太郎君の期末試験の点数が書かれている．

2 行目には 次郎君の期末試験の点数が書かれている．

3 行目には 三郎君の期末試験の点数が書かれている．

4 行目には 四郎君の期末試験の点数が書かれている．

5 行目には 花子さんの期末試験の点数が書かれている．

生徒の期末試験の点数はすべて 0 点以上 100 点以下の整数である．

生徒の期末試験の点数はすべて 5 の倍数である．

5 人の生徒の成績の平均点は必ず整数になる．

出力

5 人の生徒の成績の平均点をあらわす整数を 1 行で出力せよ．

入出力例

入力例 1

10
65
100
30
95

出力例 1

68

入出力例 1 では，太郎君と四郎君の期末試験の点数は 40 点未満なので，太郎君と四郎君の成績は 40 点になる．次郎君と三郎君と花子さんの期末試験の点数は 40 点以上なので，次郎君の成績は 65 点，三郎君の成績は 100 点，花子さんの成績は 95 点となる．5 人の成績の合計は 340 なので，平均点は 68 点となる．

入力例 2

40
95
0
95
50

出力例 2

64

問題文と自動審判に使われるデータは、情報オリンピック日本委員会が作成し公開している問題文と採点用テストデータです。


var input = require('fs').readFileSync('/dev/stdin', 'utf8');
var Arr=(input.trim()).split("\n");
var n=Arr.shift()-0;
for(var I=0;I<n;I++){
   var str=Arr.shift();
   var arr=[];
   for(var i=1;i<str.length;i++){
      arr.push([str.slice(0,i),str.slice(i,str.length)]);
   }
   var obj={};
   for(var i=0;i<arr.length;i++){
      var A=arr[i][0];
      var B=arr[i][1];
      var a=A.split("").reverse().join("");
      var b=B.split("").reverse().join("");
      obj[A+B]=true;
      obj[A+b]=true;
      obj[a+B]=true;
      obj[a+b]=true;
      obj[B+A]=true;
      obj[B+a]=true;
      obj[b+A]=true;
      obj[b+a]=true;
   }
   console.log(Object.keys(obj).length);
}

Problem B: Organize Your Train part II

RJ Freight, a Japanese railroad company for freight operations
has recently constructed exchange lines at Hazawa, Yokohama.
The layout of the lines is shown in Figure B-1.

Figure B-1: Layout of the exchange lines

A freight train consists of 2 to 72 freight cars. There are 26
types of freight cars, which are denoted by 26 lowercase letters
from "a" to "z". The cars of the same type are indistinguishable from
each other, and each car's direction doesn't matter either.
Thus, a string of lowercase letters of length 2 to 72 is sufficient
to completely express the configuration of a train.

Upon arrival at the exchange lines, a train is divided into two
sub-trains at an arbitrary position (prior to entering the
storage lines). Each of the sub-trains may have its direction
reversed (using the reversal line). Finally, the two sub-trains
are connected in either order to form the final configuration.
Note that the reversal operation is optional for each of the
sub-trains.

For example, if the arrival configuration is "abcd", the train
is split into two sub-trains of either 3:1, 2:2 or 1:3 cars.
For each of the splitting, possible final configurations are
as follows ("+" indicates final concatenation position):

[3:1]
abc+d cba+d d+abc d+cba
[2:2]
ab+cd ab+dc ba+cd ba+dc cd+ab cd+ba dc+ab dc+ba
[1:3]
a+bcd a+dcb bcd+a dcb+a

Excluding duplicates, 12 distinct configurations are possible.

Given an arrival configuration, answer
the number of distinct configurations which can be
constructed using the exchange lines described above.

Input

The entire input looks like the following.

the number of datasets = m

1st dataset

2nd dataset

...

m-th dataset

Each dataset represents an arriving train, and is a string of
2 to 72 lowercase letters in an input line.

Output

For each dataset, output the number of possible train configurations
in a line. No other characters should appear in the output.

Sample Input

4
aa
abba
abcd
abcde

Output for the Sample Input

1
6
12
18


function Main(input){
    input = input.split("\n");
    var k = 0;
    while(1){
        input[k] = input[k].split(" ");
        var n = parseInt(input[k][0],10);
        var m = parseInt(input[k++][1],10);
        if(n == 0 && m == 0)
            break;
        var t = [],h = [],tsum = 0,hsum = 0;

        for(var i = 0;i < n;i++){
            t[i] = parseInt(input[k++],10);
            tsum += t[i];
        }
        for(var i = 0;i < m;i++){
            h[i] = parseInt(input[k++],10);
            hsum += h[i];
        }
        if((tsum + hsum) % 2){
            console.log("-1");
            continue;
        }
        var flag = true;
        for(var i = 0;i < n;i++){
            for(var j = 0;j < m;j++){
               if(tsum - t[i] + h[j] == hsum + t[i] - h[j]){
                   flag = false;
                   console.log(t[i] + " " + h[j]);
                   break;
               }
            }
            if(!flag)
                break;
        }
        if(flag)
            console.log("-1");
    }
}
Main(require("fs").readFileSync("/dev/stdin","utf8"));

Problem A: Equal Total Scores

Taro and Hanako have numbers of cards in their hands.
Each of the cards has a score on it.
Taro and Hanako wish to make the total scores of their cards equal
by exchanging one card in one's hand with one card in the other's hand.
Which of the cards should be exchanged with which?

Note that they have to exchange their
cards even if they already have cards of the same total score.

Input

The input consists of a number of datasets.
Each dataset is formatted as follows.

n m

s1

s2

...

sn

sn+1

sn+2

...

sn+m

The first line of a dataset contains two numbers
n and m delimited by a space, where n
is the number of cards that Taro has
and m is the number of cards that Hanako has.
The subsequent n+m lines
list the score for each of the cards,
one score per line. The first n scores
(from s1 up to sn)
are the scores of Taro's cards
and the remaining m scores
(from sn+1 up to sn+m)
are Hanako's.

The numbers n and m
are positive integers no greater than 100. Each score
is a non-negative integer no greater than 100.

The end of the input is indicated by a line containing two zeros delimited
by a single space.

Output

For each dataset, output a single line containing two numbers delimited
by a single space, where the first number is the score of the card Taro
gives to Hanako and the second number is the score of the card Hanako gives
to Taro.
If there is more than one way to exchange a pair of cards
that makes the total scores equal,
output a pair of scores whose sum is the smallest.

In case no exchange can make the total scores equal, output a
single line containing solely -1.
The output must not contain any superfluous characters
that do not conform to the format.

Sample Input

2 2
1
5
3
7
6 5
3
9
5
2
3
3
12
2
7
3
5
4 5
10
0
3
8
1
9
6
0
6
7 4
1
1
2
1
2
1
4
2
3
4
3
2 3
1
1
2
2
2
0 0

Output for the Sample Input

1 3
3 5
-1
2 2
-1


function prime(max){
   var arr=[];
   for(var i=0;i<=max;i++)arr[i]=i;
   arr[0]=false;
   arr[1]=false;
   var sqrt=Math.floor(Math.sqrt(max));
   for(var i=2;i<=sqrt;i++){
      if(arr[i]==false)continue;
         for(var j=i+i;j<=max;j+=i){
            arr[j]=false;
         }
   }
   var result=[];
   for(var i=0;i<=max;i++){
      if(arr[i]!==false)result.push(arr[i]);
   }
   return result;
}
var PRIME=prime(100000);

var input = require('fs').readFileSync('/dev/stdin', 'utf8');
var arr=input.trim().split("\n");
arr.some(function(v){
   if(v=="0 0 0")return true;
   var mab=v.split(" ").map(Number);
   var m=mab[0];
   var a=mab[1];
   var b=mab[2];
   var ans=[0,0,0];
   for(var p=0;p<PRIME.length;p++){
      for(var q=p;q<PRIME.length;q++){
         var pq=PRIME[p]*PRIME[q];
         if(pq>m)break;
         if(PRIME[q]*a <= PRIME[p]*b && ans[2]<pq)ans=[PRIME[p],PRIME[q],pq]
      }
   }
   console.log(ans[0]+" "+ans[1]);
});

Problem A: Calling Extraterrestrial Intelligence Again

A message from humans to extraterrestrial intelligence was sent through the Arecibo radio telescope in Puerto Rico on the afternoon of Saturday November l6, l974. The message consisted of l679 bits and was meant to be translated to a rectangular picture with 23 × 73 pixels. Since both 23 and 73 are prime numbers, 23 × 73 is the unique possible size of the translated rectangular picture each edge of which is longer than l pixel. Of course, there was no guarantee that the receivers would try to translate the message to a rectangular picture. Even if they would, they might put the pixels into the rectangle incorrectly. The senders of the Arecibo message were optimistic.

We are planning a similar project. Your task in the project is to find the most suitable width and height of the translated rectangular picture. The term ``most suitable'' is defined as follows. An integer m greater than 4 is given. A positive fraction a/b less than or equal to 1 is also given. The area of the picture should not be greater than m. Both of the width and the height of the translated picture should be prime numbers. The ratio of the width to the height should not be less than a/b nor greater than 1. You should maximize the area of the picture under these constraints.

In other words, you will receive an integer m and a fraction a/b . It holds that m > 4 and 0 < a/b ≤ 1 . You should find the pair of prime numbers p, q such that pq ≤ m and a/b ≤ p/q ≤ 1 , and furthermore, the product pq takes the maximum value among such pairs of two prime numbers. You should report p and q as the "most suitable" width and height of the translated picture.

Input

The input is a sequence of at most 2000 triplets of positive integers, delimited by a space character in between. Each line contains a single triplet. The sequence is followed by a triplet of zeros, 0 0 0, which indicates the end of the input and should not be treated as data to be processed.

The integers of each input triplet are the integer m, the numerator a, and the denominator b described above, in this order. You may assume 4 < m < 100000 and 1 ≤ a ≤ b ≤ 1000.

Output

The output is a sequence of pairs of positive integers. The i-th output pair corresponds to the i-th input triplet. The integers of each output pair are the width p and the height q described above, in this order.

Each output line contains a single pair. A space character is put between the integers as a delimiter. No other characters should appear in the output.

Sample Input

5 1 2
99999 999 999
1680 5 16
1970 1 1
2002 4 11
0 0 0

Output for the Sample Input

2 2
313 313
23 73
43 43
37 53