import scala.io.StdIn._

object Main {
    def main(args: Array[String]): Unit = {
        val seq: Seq[Int] = (0 until 10).map(_ => readInt())
        val rev: Seq[Int] = seq.sorted.reverse
        for(i <- 0 until 3) println(rev(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.


import scala.io.Source

object Main extends App {
  val input = Source.stdin.getLines
  input.toSeq.map(_.toInt).sorted.reverse.take(3).foreach(println)
}


import scala.io.Source.stdin

object Main {
  def main(args: Array[String]) = {
    stdin.getLines().map(_.split(" ").map(_.toInt).reduce(_+_).toString.length).foreach(println)
  }
}

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


object Main extends App{

  val n = io.StdIn.readInt()

  for (i <- 1 to n) {
    val sideAry = io.StdIn.readLine().split(' ').map { _.toInt }.sorted

    if (sideAry(2) * sideAry(2) == (sideAry(0) * sideAry(0) + sideAry(1) * sideAry(1)))
      println("YES")
    else
      println("NO")
  }
}

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


/**
  * http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0003
  */
object Main {
  def main(args: Array[String]): Unit = {
    val N = io.StdIn.readInt()
    Iterator.continually(io.StdIn.readLine()).takeWhile(_ != null).take(N)
      .map(_.split(" +").map(_.toInt) match { case Array(a, b, c) => (a, b, c) })
      .map { case (a, b, c) => isRightTriangle(a, b, c) }
      .map(if (_) "Yes" else "No")
      .foreach(println)
  }

  def isRightTriangle(x: Int, y: Int, z: Int): Boolean = {
    val (a, b, c) = Seq(x, y, z).sorted match {
      case Seq(_a, _b, _c) => (_a, _b, _c)
    }
    math.pow(a.toDouble, 2) + math.pow(b.toDouble, 2) == math.pow(c.toDouble, 2)
  }

}


object Main extends App {
  (1 to readInt)
    .map(_ => readLine.split(" ").map(_.toInt))
    .map(s => {
      val max = s.max
      if (s.filter(_ != max).map(_ ^ 2).sum == (max ^ 2)) "YES" else "NO"
    })
    .foreach(println)
}


object Main extends App {
  def square(a: Int) = a * a
  (1 to readInt)
    .map(_ => readLine.split(" ").map(_.toInt).sorted.reverse)
    .map(s => if (s.tail.map(square).sum == square(s.head)) "YES" else "NO")
    .foreach(println)
}


object Main {
	def main(args:Array[String]) = {
	    val sc = new java.util.Scanner(System.in)
	    while(sc.hasNext){
	      val a,b,c,d,e,f = sc.nextInt
	      val y = (c*d-a*f)/(b*d-a*e)
	      val x = (c-b*y)/a
	      println(BigDecimal(x).setScale(3, BigDecimal.RoundingMode.HALF_UP)+" "+BigDecimal(y).setScale(3, BigDecimal.RoundingMode.HALF_UP))
	    }

    }
}

Simultaneous Equation

Write a program which solve a simultaneous equation:

ax + by = c

dx + ey = f

The program should print x and y for given a, b, c, d, e and f (-1,000 ≤ a, b, c, d, e, f ≤ 1,000). You can suppose that given equation has a unique solution.

Input

The input consists of several data sets, 1 line for each data set. In a data set, there will be a, b, c, d, e, f separated by a single space. The input terminates with EOF.

Output

For each data set, print x and y separated by a single space. Print the solution to three places of decimals. Round off the solution to three decimal places.

Sample Input 1

1 2 3 4 5 6
2 -1 -2 -1 -1 -5

Output for the Sample Input 1

-1.000 2.000
1.000 4.000

Sample Input 2

2 -1 -3 1 -1 -3
2 -1 -3 -9 9 27

Output for the Sample Input 2

0.000 3.000
0.000 3.000


object Main extends App {

  def safeDivide(l: Double, r: Double) = if (l == 0.0) 0.0 else l / r
  def format(x: Double) = {
    val s = (x * 1000).round formatted "%04d"
    s.dropRight(3) + "." + s.takeRight(3)
  }

  val sc = new java.util.Scanner(Console.in)

  while (sc.hasNextLine()) {
    val line = sc.nextLine()
    val Array(a, b, c, d, e, f) = line.split(' ').map(_.toDouble)
    val x = safeDivide(c*e - b*f, a*e - b*d)
    val y = safeDivide(c - a*x, b)

    println(format(x) + " " + format(y))
  }
}


object Main extends App {
  val sc = new java.util.Scanner(System.in)
  val n = sc.nextInt
  var num: BigInt = 100000
  for(i <- 0 until n) {
    num += num / 20
    if(num%10!=0) {
      num = num / 10
      num = num * 10 + 10
    }
    if(num%100!=0) {
      num = num / 100
      num = num * 100 + 100
    }
    if(num%1000!=1000) {
      num = num / 1000
      num = num * 1000 + 1000
    }
  }
  println(num-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


object Main {
    def main(args:Array[String]) = {
        val sc = new java.util.Scanner(System.in)
        while(sc.hasNext){
	        val n = sc.nextInt
	        val list = for(a <- 0 to 9; b <- 0 to 9; c <- 0 to 9; d <- 0 to 9 if a+b+c+d == n) yield 1
	        println(list.size)
    	}
    }
}

Sum of 4 Integers

Write a program which reads an integer n and identifies the number of combinations of a, b, c and d (0 ≤ a, b, c, d ≤ 9) which meet the following equality:

a + b + c + d = n

For example, for n = 35, we have 4 different combinations of (a, b, c, d): (8, 9, 9, 9), (9, 8, 9, 9), (9, 9, 8, 9), and (9, 9, 9, 8).

Input

The input consists of several datasets. Each dataset consists of n (1 ≤ n ≤ 50) in a line. The number of datasets is less than or equal to 50.

Output

Print the number of combination in a line.

Sample Input

35
1

Output for the Sample Input

4
4


import scala.io.StdIn._
import scala.collection._

object Main {

  class Sieve(val n: Int){
    private[this] val top = (n - 3) / 2 + 1
    private[this] val sqrtLimit = (Math.sqrt(n).toInt - 3) / 2

    private[this] val cmpsts = new Array[Int]((top >>> 5) + 1)
    def isPrime(ci: Int): Boolean = (cmpsts(ci >>> 5) & (1 << (ci & 31))) == 0
    def notPrime(ci: Int): Unit = cmpsts(ci >>> 5) |= 1 << (ci & 31)

    def next(i: Int): Int = if((i > top) || isPrime(i)) 2 * i + 3 else next(i + 1)

    def exec: Iterator[Int] = {
/*
      for{
        i <- 0 to sqrtLimit
        if isPrime(i)
        j <- Range(((2 * i + 3)*(2 * i + 3)-3)/2, top, (2 * i + 3))
      } notPrime(j)
      */
      /*
      (0 to sqrtLimit).map{ i =>
        val p = 2 * i + 3
        if(isPrime(i))Range((p*p-3)/2, top, p).map{notPrime}
      }
      */

      (0 to sqrtLimit).withFilter(isPrime).map { i =>
          Range(((2 * i + 3)*(2 * i + 3)-3)/2, top, (2 * i + 3)).map(notPrime)
      }

      if(n==2)Iterator.single(2)
      else Iterator.single(2) ++ Iterator.iterate(3)(p => next((p - 1) / 2)).takeWhile(_ <= n)
    }
  }

  def loop(s: String){
    if(s != null){
       val Array(n,_*) = s.split(" ").map(_.toInt)
       if(n<2) println(0)
       else println(new Sieve(n).exec.size)
       loop(readLine)
    }
  }

  def main(args: Array[String]): Unit = loop(readLine)
}

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


import scala.io.StdIn.readInt

object Main {
  def sieve(n:Int) = {
    val primes = Array.tabulate(n+1) { _ % 2 }
    primes(1) = 0
    primes(2) = 1

    for{
      i <- 3 to Math.sqrt(n).toInt by 2
      if primes(i) == 1
    }
      (i*i to n by i*2).foreach { primes(_) = 0 }

    primes
  }

  def main(args:Array[String]) = {
    val p = sieve(1000000)
    val n = readInt
    println(p.take(n+1).sum)
  }
}


import scala.io.Source.stdin

object Main {
  def sieve(n:Int) = {
    val primes = Array.tabulate(n+1) { _ % 2 }
    primes(1) = 0
    primes(2) = 1

    for( i <- 3 to Math.sqrt(n).toInt by 2 )
    {
      if(primes(i) == 1)
        (i*i to n by i*2).foreach { primes(_) = 0 }
      primes(i) = primes(i) + primes(i-1)
      primes(i+1) = primes(i)
    }

    for(i<-Math.sqrt(n).toInt+1 to n)
      primes(i) = primes(i)+primes(i-1)

    primes
  }

  def main(args:Array[String]) = {
    val p = sieve(1000000)
    for(i <- stdin.getLines)
      println(p(i.toInt))
  }
}


object Main {
  def main(args: Array[String]): Unit = {
    io.Source.stdin.getLines foreach (n => println(pi(n.toInt)))
  }
  val primes: Vector[Int] = (2 #:: Stream.from(3).filter(n=> Primes.miller_rabin_test(n))).take(1000).toVector

  def pi(x: Int): Int = {
    if (x <= 1) 0
    else {
      val a = pi(Math.sqrt(x).toInt)
      phi(x, a) + a - 1
      }
  }

  def phi(x: Int, a:Int): Int = {
    val ps = primes take a
    (1 to x).count(i => ps.forall(p => i % p != 0))
  }
  object Primes {
    private def mod_exp(x: BigInt, n: Int, m: Int): BigInt = {
      def loop(x: BigInt, n: Int, acc: BigInt): BigInt = {
        if (n == 0) acc
        else loop (
          (x * x) % m,
          n >> 1,
          if ((n & 1) == 1) (acc * x) % m else acc
        )
      }
      loop(x,n,1)
    }
    private def div_pow_2(d: Int, s: Int = 0): (Int, Int) ={
      if ((d % 2) != 0) (d,s)
      else div_pow_2(d/2, s+1)
    }
    private def miller_rabin(n: Int, a: Int): Boolean = {
      val (d,s): (Int, Int) = div_pow_2(n-1)
      val a_exp_d: BigInt = mod_exp(a,d,n)
      def double(x: BigInt): BigInt = mod_exp(x,2,n)
      def loop(e: BigInt, i: Int): Boolean = {
        if (i == 0) false
        else if (e == n-1) true
        else loop(double(e), i-1)
      }
      a_exp_d == 1 || loop(a_exp_d, s)
    }
    def miller_rabin_test(n: Int, k: Int = 20): Boolean = {
      def loop(i: Int): Boolean = {
        if (i == 0) true
        else {
          val a = scala.util.Random.nextInt(n-1)+1
          if (miller_rabin(n,a)) loop(i-1)
          else false
        }
      }
      if (n < 2) false
      else loop(k)
    }
  }
}


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


import scala.io.StdIn.{readLine,readInt}
import scala.math.BigDecimal

object Main {
    def round(x:Double) = BigDecimal(x).setScale(3,BigDecimal.RoundingMode.HALF_UP).toDouble

    def main(args:Array[String]) = {
        val n = readInt
         for(i <- 0 until n) {
            val m = readLine.split(" ").map(_.toDouble)
            val (x12,y12,x13,y13) = (m(0)-m(2),m(1)-m(3),m(0)-m(4),m(1)-m(5))
            val (xx1,yy1,xx2,yy2,xx3,yy3) = (m(0)*m(0),m(1)*m(1),m(2)*m(2),m(3)*m(3),m(4)*m(4),m(5)*m(5))
            val g = 2*(x12*y13 - y12*x13)
            val x = (y13*(xx1 - xx2 + yy1 - yy2) - y12*(xx1 - xx3 + yy1 - yy3))/g
            val y = (x12*(xx1 - xx3 + yy1 - yy3) - x13*(xx1 - xx2 + yy1 - yy2))/g

            printf("%.3f %.3f %.3f\n",round(x),round(y),round(Math.sqrt(x*x+y*y)))
        }
    }
}


import Math._
object Main extends App {
  val n = readLine().toInt

  for (i <- 0 until n) {
    val Seq(x1, y1, x2, y2, x3, y3) = readLine().split(' ').map(_.toDouble).toList
    val l1 = pow(x2 - x3, 2) + pow(y2 - y3, 2)
    val l2 = pow(x3 - x1, 2) + pow(y3 - y1, 2)
    val l3 = pow(x1 - x2, 2) + pow(y1 - y2, 2)

    val G1 = l1*(l2 + l3 - l1)
    val G2 = l2*(l3 + l1 - l2)
    val G3 = l3*(l1 + l2 - l3)

    val px = (G1 * x1 + G2 * x2 + G3 * x3) / (G1 + G2 + G3)
    val py = (G1 * y1 + G2 * y2 + G3 * y3) / (G1 + G2 + G3)

    val u1 = sqrt(l1)
    val u2 = sqrt(l2)
    val u3 = sqrt(l3)

    val r = (u1 * u2 * u3) / sqrt((u1 + u2 + u3) * (-u1 + u2 + u3) * (u1 - u2 + u3) * (u1 + u2 - u3))

    println("%.3f %.3f %.3f".format(px, py, r))
  }
}


object Main extends App {
  import scala.io.Source.stdin

  val b = new StringBuilder

  for(d<-stdin.getLines.map(_.toInt)) {
    var i = 0
    var s = 0
    while(i*d < 600) {
      s += i*i
      i += 1
    }
    b.append(s*d*d*d+"\n")
  }
  print(b.result)
}

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

Integral

Write a program which computes the area of a shape represented by the following three lines:

$y = x^2$

$y = 0$

$x = 600$

It is clear that the area is $72000000$, if you use an integral you learn in high school. On the other hand, we can obtain an approximative area of the shape by adding up areas of many rectangles in the shape as shown in the following figure:

$f(x) = x^2$

The approximative area $s$ where the width of the rectangles is $d$ is:

area of rectangle where its width is $d$ and height is $f(d)$ $+$

area of rectangle where its width is $d$ and height is $f(2d)$ $+$

area of rectangle where its width is $d$ and height is $f(3d)$ $+$

...

area of rectangle where its width is $d$ and height is $f(600 - d)$

The more we decrease $d$, the higer-precision value which is close to $72000000$ we could obtain. Your program should read the integer $d$ which is a divisor of $600$, and print the area $s$.

Input

The input consists of several datasets. Each dataset consists of an integer $d$ in a line. The number of datasets is less than or equal to 20.

Output

For each dataset, print the area $s$ in a line.

Sample Input

20
10

Output for the Sample Input

68440000
70210000


object Main extends App {
  for(d<-scala.io.Source.stdin.getLines.map(_.toInt)) {
    var (i,s) = (0,0)
    while(i*d < 600) {
      s += i*i
      i += 1
    }
    println(s*d*d*d)
  }
}


import scala.io.StdIn.readLine

object Main extends App {
  def read(e:Double,n:Double,angle:Double):(Double,Double) = {
    val l = readLine.split(",").map(_.toDouble);val x=l(0);val y=l(1)
    if(x==0 && y==0) (e,n)
    else read(e+x*Math.cos(Math.toRadians(angle)),n+x*Math.sin(Math.toRadians(angle)),angle-y)
  }
  val (e,n) = read(0,0,90)
  println(e.toInt)
  println(n.toInt)
}

Treasure Hunt

When a boy was cleaning up after his grand father passing, he found an old paper:

In addition, other side of the paper says that "go ahead a number of steps equivalent to the first integer, and turn clockwise by degrees equivalent to the second integer".

His grand mother says that Sanbonmatsu was standing at the center of town. However, now buildings are crammed side by side and people can not walk along exactly what the paper says in. Your task is to write a program which hunts for the treature on the paper.

For simplicity, 1 step is equivalent to 1 meter. Input consists of several pairs of two integers d (the first integer) and t (the second integer) separated by a comma. Input ends with "0, 0". Your program should print the coordinate (x, y) of the end point. There is the treature where x meters to the east and y meters to the north from the center of town.

You can assume that d ≤ 100 and -180 ≤ t ≤ 180.

Input

A sequence of pairs of integers d and t which end with "0,0".

Output

Print the integer portion of x and y in a line respectively.

Sample Input

56,65
97,54
64,-4
55,76
42,-27
43,80
87,-86
55,-6
89,34
95,5
0,0

Output for the Sample Input

171
-302


object Main extends App {
  val n = scala.io.StdIn.readLine.split(" ").map(_.toInt).sorted.reverse
  println(n(0)+" "+n(1)+" "+n(2)+" "+n(3)+" "+n(4))
}

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


object Main extends App {
  def myFactorial(n: Int): Int = if (n == 0) 1 else n * myFactorial(n-1)

  println(myFactorial(io.Source.stdin.getLines.next.toInt))
}

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


object Main extends App {
  println(readLine.toUpperCase)
}

Capitalize

Write a program which replace all the lower-case letters of a given text with the corresponding captital letters.

Input

A text including lower-case letters, periods, and space is given in a line. The number of characters in the text is less than or equal to 200.

Output

Print the converted text.

Sample Input

this is a pen.

Output for the Sample Input

THIS IS A PEN.


object Main extends App {
  val n = readInt()
  (1 to n).foreach { i =>
    val arr = readLine().split(" ").map(_.toDouble).map(_ * 100000)
    val (x1, y1) = (arr(0), arr(1))
    val (x2, y2) = (arr(2), arr(3))
    val (x3, y3) = (arr(4), arr(5))
    val (x4, y4) = (arr(6), arr(7))
    val ab = (y2 - y1) / (x2 - x1)
    val cd = (y4 - y3) / (x4 - x3)
    if (ab == cd) println("YES") else println("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


object Main {
    def main(args: Array[String]) = {
        val in = io.Source.stdin.getLines.map(_.toInt)
        for (n <- in if n != 0) println(in.take(n).scanLeft(-100000)((a, b) => b max (a+b)).max)
    }
}

Maximum Sum Sequence

Given a sequence of numbers a1, a2, a3, ..., an, find the maximum sum of a contiguous subsequence of those numbers. Note that, a subsequence of one element is also a contiquous subsequence.

Input

The input consists of multiple datasets. Each data set consists of:

n
a1
a2
.
.
an

You can assume that 1 ≤ n ≤ 5000 and -100000 ≤ ai ≤ 100000.

The input end with a line consisting of a single 0.

Output

For each dataset, print the maximum sum in a line.

Sample Input

7
-5
-1
6
4
9
-6
-7
13
1
2
3
2
-2
-1
1
2
3
2
1
-2
1
3
1000
-200
201
0

Output for the Sample Input

19
14
1001


import scala.io.StdIn._

object Main {
  def main(args: Array[String]): Unit = {
    while (true) {
      val n = readInt
      if (n == 0) return
      var sum = readInt
      var tmp = sum
      var max = tmp
      for (i <- 1 until n) {
        val x = readInt
        tmp = Math.max(x, tmp)
        sum += x
        if (sum < tmp) {
          sum = tmp
        }
        max = Math.max(max, sum)
      }
      println(max)
    }
  }
}


import scala.io.StdIn._

object Main {
  def main(args: Array[String]): Unit = {
    while (true) {
      val n = readInt
      if (n == 0) return

      var list: Array[Long] = Array.empty
      for (i <- 0 until n) {
        list :+= readInt.toLong
      }
      println(execute(list))
    }

    //println(execute(Array(-5, -1, 6, 4, 9, -6)))
  }

  def execute(list: Array[Long]): Long = {

    var max = list(0)
    var tmp = max
    for (i <- 0 until list.length) {
      //val result = new Array[Long](list.length)
      //result(i) = list(i)
      tmp = list(i)
      max = Math.max(list(i), max)
      for (j <- i + 1 until list.length) {
        val x = list(j) + tmp
        max = Math.max(x, max)
        tmp = x
      }
      //      result.foreach(x => print(x + " "))
      //      println()
    }

    max
  }
}


object Main {
    def main(args:Array[String]) = {
        val sc = new java.util.Scanner(System.in)
        val n = sc.nextInt
        for(i <- 1 to n) {
            val list = List.fill(10)(sc.nextInt)
            println(solve(list))
        }
    }
    def solve(list: List[Int]): String = {
        var a = 0
        var b = 0
        var f = true
        for(i <- 0 to 9) {
            if(list(i) < a && list(i) < b) {
                f = false
            }
            else if(a < list(i) && list(i) < b) a = list(i)
            else if(list(i) < a && b < list(i)) b = list(i)
            else if (a < b) b = list(i)
            else a = list(i)
        }
        if(f) "YES"
        else "NO"
    }
}

玉

図のように二股に分かれている容器があります。1 から 10 までの番号が付けられた10 個の玉を容器の開口部 A から落とし、左の筒 B か右の筒 C に玉を入れます。板 D は支点 E を中心に左右に回転できるので、板 D を動かすことで筒 B と筒 C のどちらに入れるか決めることができます。

開口部 A から落とす玉の並びを与えます。それらを順番に筒 B 又は筒 Cに入れていきます。このとき、筒 B と筒 C のおのおのが両方とも番号の小さい玉の上に大きい玉を並べられる場合は YES、並べられない場合は NO と出力するプログラムを作成してください。ただし、容器の中で玉の順序を入れ替えることはできないものとします。また、続けて同じ筒に入れることができるものとし、筒 B, C ともに 10 個の玉がすべて入るだけの余裕があるものとします。

Input

複数のデータセットが与えられます。１行目にデータセット数 N が与えられます。つづいて、N 行のデータセットが与えられます。各データセットに 10 個の番号が左から順番に空白区切りで与えられます。

Output

各データセットに対して、YES または NO を１行に出力して下さい。

Sample Input

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

Output for the Sample Input

YES
NO


import scala.io.Source.stdin

object Main {
  def hand(i:Int,j:Int,k:Int,l:Int,m:Int):String = {
    if( (j,k,l) == (i,i,i) || (k,l,m) == (j,j,j) ) "four card"
    else if( (j,l,m) == (i,k,k) || (j,k,m) == (i,i,l) ) "full house"
    else if( (j,k) == (i,i) || (k,l) == (j,j) || (l,m) == (k,k) ) "three card"
    else if( (j,l) == (i,k) || (j,m) == (i,l) || (k,m) == (j,l) ) "two pair"
    else if( i== j || j == k || k == l || l == m ) "one pair"
    else if( (i,j,k,l,m) == (i,i+1,i+2,i+3,i+4) || (i,j,k,l,m) == (1,10,11,12,13) ) "straight"
    else "null"
  }

  def main(args:Array[String]) = {
    stdin.getLines.foreach { s=>
      val l = s.split(",").map(_.toInt).sorted
      println(hand(l(0),l(1),l(2),l(3),l(4)))
    }
  }
}

ポーカー

ポーカーの手札データを読み込んで、それぞれについてその役を出力するプログラムを作成してください。ただし、この問題では、以下のルールに従います。

ポーカーはトランプ 5 枚で行う競技です。

同じ数字のカードは 5 枚以上ありません。

ジョーカーは無いものとします。

以下のポーカーの役だけを考えるものとします。(番号が大きいほど役が高くなります。)

役なし(以下に挙げるどれにも当てはまらない)

ワンペア（2 枚の同じ数字のカードが1 組ある）

ツーペア（2 枚の同じ数字のカードが2 組ある）

スリーカード（3 枚の同じ数字のカードが1 組ある）

ストレート（5 枚のカードの数字が連続している）

ただし、A を含むストレートの場合、A で終わる並びもストレートとします。つまり、A を含むストレート
は、A 2 3 4 5 　と　10 J Q K A 　の２種類です。J Q K A 2 などのように、A をまたぐ並び
はストレートではありません。（この場合、「役なし」になります）。

フルハウス（3 枚の同じ数字のカードが1 組と、残りの2 枚が同じ数字のカード）

フォーカード（4 枚の同じ数字のカードが1 組ある）

Input

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

手札1,手札2,手札3,手札4,手札5

手札は、トランプのJ(ジャック) を11、Q(クイーン) を12、K(キング) を13、A（エース）を 1、その他はそれぞれの数字で表すこととします。

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

Output

データセットごとに、手札によってできる最も高い役をひとつ出力してください。役の表記については出力例に従ってください。

Sample Input

1,2,3,4,1
2,3,2,3,12
12,13,11,12,12
7,6,7,6,7
3,3,2,3,3
6,7,8,9,10
11,12,10,1,13
11,12,13,1,2

Output for the Sample Input

one pair
two pair
three card
full house
four card
straight
straight
null

3 3 2 3 3 という手札であったときは、two pair ではなく four card です。


import scala.io.StdIn.{readInt,readLine}

object Main {
  val alist = List(1,3,5,7,9,11,15,17,19,21,23,25)
  val blist = 0 to 25
  val invs = for{
    i<-alist
    j<-1 to 25 by 2
    if (i*j) % 26 == 1
  } yield (i,j)
  def encode(c:Int,a:Int,b:Int) = (((a*(c-97)+b) % 26)+97).toChar
  def decode(c:Int,a:Int,b:Int) = ((a*(c-97-b+26) % 26)+97).toChar

  def main(args:Array[String]) = {
    val n = readInt
    (0 until n).foreach { _ =>
      val l = readLine
      val (a,b) = {for(i<-alist;j<-blist) yield (i,j)}.find{ case (i,j) =>
            l.contains("that".map{encode(_,i,j)}) || l.contains("this".map{encode(_,i,j)})
      }.get
      println( l.map { c=> if(c>=97 && c<=122) decode(c,invs.find(s => s._1 == a).get._2,b) else c })
    }
  }
}

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

アフィン暗号

簡単な暗号法の一つに、アフィン暗号というものがあります。まず、アルファベット a〜z を a = 0, b = 1, c = 2,..., x = 23, y = 24, z = 25 と 0〜25 の数字に置き換えます。そして、以下の式で、原文のアルファベットを置換します。

$F(\gamma) = (\alpha \cdot \gamma + \beta)$ mod $26$

ただし、mod 26 は 26 で割った余りを表します。例えば、$\alpha = 3, \beta = 2$ のとき、アルファベットの 'a' (=0) は、$F(0) = (3 \cdot 0 + 2)$ mod $26 = 2$ で 'c' に、アルファベットの 'n' (=13) は $F(13) = (3 \cdot 13 + 2)$ mod $26 = 15$ で 'p' に置換されます。
このとき、$\gamma$ に対する $F(\gamma)$ が必ず 1 対 1 で対応付けられるように、$\alpha$ と $\beta$ は慎重に選ばれているものとします（$\alpha$ と 26 が互いに素であることが条件）。$\alpha = 4, \beta = 7$ のときのように、$F('a') = 7, F('n') = 7$ と、'a' も 'n' も同じ 'h' に置換されるようなことはありません。また、アルファベット以外の文字は置換されません。

暗号化された文字列を元の文章に復号したものを出力するプログラムを作成してください。元の文章には、キーワードとして

that
this

のいずれかが必ず含まれているものとします。

Input

複数のデータセットが与えられます。１行目にデータセット数 $n$ ($n \leq 30$) が与えられます。続いて $n$ 行のデータが与えられます。各データセットに英小文字と空白からなる 256 文字以内の暗号化された文章が１行に与えられます。

Output

各データセットに対して、復号した元の文章を１行に出力して下さい。

Sample Input

1
y eazqyp pnop pngtg ye obmpngt xmybp mr lygw

Output for the Sample Input

i submit that there is another point of view


import scala.io.StdIn.{readLine,readInt}

object Main extends App {

  var index = 1
  Iterator.continually(readInt).takeWhile ( w => w != 0).foreach { w =>
    val n = readInt
    val wv = Array.ofDim[Int](n+1,2)
    val m = Array.ofDim[Int](n+1,w+1)
    var max = 0
    var maxw = 0

    for(i<-1 to n) wv(i) = readLine.split(",").map(_.toInt)
    for(i<-1 to n;j<-0 to w if j>= wv(i)(1)) {
          if(m(i-1)(j) < wv(i)(0) + m(i-1)(j-wv(i)(1))) {
            m(i)(j) = wv(i)(0) + m(i-1)(j-wv(i)(1))
            if(max < m(i)(j)) {
              maxw = j
              max = m(i)(j)
            }
          } else {
            m(i)(j) = m(i-1)(j)
          }
    }
    println("Case "+index+":")
    println(m(n)(w))
    println(maxw)
    index += 1
  }
}

泥棒

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

風呂敷が耐えられる重さ 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


import scala.io.StdIn.{readLine,readInt}

object Main extends App {
  val seq1 = for(i<-1 to 9) yield List(i,i,i)
  val seq2 = for(i<-1 to 7) yield List(i,i+1,i+2)

  def check(m:List[Int], count:Int,u:Int,v:Int):Boolean =
    if(m.length != count) false
    else if(count==2) {
      val List(x,y) = m
      if(x==y) true else false
    } else
      (u to 8).exists( i=> check(m diff seq1(i),count-3,i+1,v)) || (v to 6).exists(i=> check(m diff seq2(i),count-3,u,i))

  Iterator.continually(readLine).takeWhile ( _!=null ).foreach { line =>
    val l = line.map(_.asDigit).toList
    val m = (1 to 9).filter { i=> if(l.count( _==i ) >= 4) false else check(i::l,14,0,0) }
    if(m.length>0) println(m.mkString(" ")) else println(0)
  }
}

パズル

1 〜 9 の数字を 14 個組み合わせて完成させるパズルがあります。与えられた 13 個の数字にもうひとつ数字を付け加えて完成させます。

パズルの完成条件は

同じ数字を２つ組み合わせたものが必ずひとつ必要です。

残りの12 個の数字は、３個の数字の組み合わせ４つです。

３個の数字の組み合わせ方は、同じ数字を３つ組み合わせたものか、または３つの連続する数字を組み合わせたものです。ただし、9 1 2 のような並びは連続する数字とは認められません。

同じ数字は4 回まで使えます。

13 個の数字からなる文字列を読み込んで、パズルを完成することができる数字を昇順に全て出力するプログラムを作成してください。なお、1〜9 のどの数字を付け加えてもパズルを完成させることができないときは 0 を出力してください。

例えば与えられた文字列が 3456666777999 の場合

「2」があれば、　234 567 666 77 999

「3」があれば、　33 456 666 777 999

「5」があれば、　345 567 666 77 999

「8」があれば、　345 666 678 77 999

というふうに、2 3 5 8 のいずれかの数字が付け加えられるとパズルは完成します。「6」でも整いますが、5 回目の使用になるので、この例では使えないことに注意してください。

Input

入力は複数のデータセットからなります。各データセットとして、13 個の数字が１行に与えられます。データセットの数は 50 を超えません。

Output

データセットごとに、パズルを完成させることができる数字を昇順に空白区切りで１行に出力します。

Sample Input

3649596966777
6358665788577
9118992346175
9643871425498
7755542764533
1133557799246

Output for the Sample Input

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


object Main {
  def main(args: Array[String]) = {
    var min: Double = 1000000 + 1
    var max: Double = -1
    for (x <- io.Source.stdin.getLines()) {
      val y = x.toDouble
      if (y < min) min = y
      else if (y > max) max = y
    }
    println(max - min)
  }
}

標高差

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

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


import scala.io.StdIn.readInt
import scala.collection.mutable.ArrayBuffer

object Main {
  def sieve(n:Int) = {
    val list = Array.tabulate(n+1) { _ % 2 }
    val primes = new ArrayBuffer[Int]
    list(1) = 0
    list(2) = 2
    primes += 2

    for( i <- 3 to Math.sqrt(n).toInt by 2 )
    {
      if(list(i) == 1) {
        (i*i to n by i*2).foreach { list(_) = 0 }
        primes += primes(primes.length-1)+i
      }
    }
    for(i<-Math.sqrt(n).toInt+1 to n if list(i)==1)
      primes += primes(primes.length-1)+i
    primes.toArray
  }

  def main(args:Array[String]) = {
    val p = sieve(200000)
    var n = 0
    while( { n = readInt; n} != 0 ) println(p(n-1))
  }
}

素数の和

p(i) を小さい方から i 番目の素数とします。例えば、7 は、2, 3, 5, 7 と小さい方から 4 番目の素数なので、p(4) = 7 です。

n が与えられたとき、i = 1 から n までの p(i) の和 s

s = p(1) + p(2) + .... + p(n)

を出力するプログラムを作成してください。例えば、n = 9 のとき、s = 2 + 3 + 5 + 7 + 11 + 13 + 17 + 19 + 23 = 100 となります。

Input

複数のデータセットが与えられます。各データセットに整数 n (n ≤ 10000) が与えられます。n が 0 のとき入力の最後とします。データセットの数は 50 を超えません。

Output

各データセットの n に対して、s を１行に出力して下さい。

Sample Input

2
9
0

Output for the Sample Input

5
100


object Main extends App {
    for (Array(a, b, n) <- io.Source.stdin.getLines.map(_.split(" ").map(_.toInt))) {
        val x = (0 until n).foldLeft((a, 0))((p, _) => (p._1 % b * 10, p._2 + p._1 % b * 10 / b))
        println(x._2)
    }
}

小数位の和

a, b, n は、いずれも正の整数であるとします。分数 a / b の小数第 i 位の数を f(i) とします (0 ≤ f(i) ≤ 9)。このとき、i = 1 から n までの f(i) の和を s とします。

s = f(1) + f(2) + ... + f(n)

a, b, n を読み込んで、 s を出力して終了するプログラムを作成してください。

Input

入力は複数のデータセットからなります。各データセットとして、3 つの整数 a (1 ≤ a ≤ 1000), b (1 ≤ b ≤ 10000), n (1 ≤ n ≤ 100) が空白区切りで１行に与えられます。

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

Output

データセットごとに、s を１行に出力します。

Sample Input

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

Output for the Sample Input

5
24
7
6


import scala.io.StdIn.readLine
import scala.collection.mutable.ArrayBuffer

object Main {
  def main(args:Array[String]) = {
    var n = 0
    val b = new ArrayBuffer[String]
    while({n=readLine.trim.toInt;n}!=0) {
      val a = Array.ofDim[Int](n,n)
      var (i,j,m) = (n/2+1,n/2,1)
      a(i)(j) = m
      m += 1
      i += 1
      j += 1
      while(m<=n*n) {
        if(j>=n) j=0 else if(j<0) j=n-1
        if(i>=n) i=0
        if(a(i)(j)!=0) {
          i += 1
          j -= 1
        } else {
          a(i)(j) = m
          m += 1
          i += 1
          j += 1
        }
      }
      b+=a.map(s=>s.map("%4d".format(_)).mkString).mkString("\n")
    }
    println(b.mkString("\n"))
  }
}

魔方陣

n × n の正方形のマス目の中に数字の１から n × n が一つずつ入っていて、縦のどの列のマス目の和も、横のどの列のマス目の和も対角線のマス目の和も等しいものを魔方陣といいます。

一辺のマスの個数が奇数の魔方陣の作り方には以下の方法があります。

中央のマス目のちょうど一つ下のマス目に１を入れる。

次の数字を右斜め下のマス目に入れる。
ただし、数字を入れようとしたマス目が正方形からはみ出している場合、すでに数字が埋まっている場合は以下の方法に従って数字を入れるマス目を探す。

右にはみ出した場合には、同じ行の左はしに、左にはみ出した場合には、同じ行の右はしに、下にはみ出した場合には、同じ列の一番上に数字を入れる。

数字を入れようとしたマス目が埋まっているときには、その埋まっているマス目の左斜め下のマス目に入れる。

全てのマス目が埋まるまで２を繰り返す。

この方法に従って、一辺のマス目の個数 n を入力として、その大きさの魔方陣を出力するプログラムを作成して下さい。ただし、n は 3 以上 15 以下の奇数とします。マス目に入る各数字は右詰 4 桁で出力してください。

入力

複数の入力が与えられます。各入力で n （正の整数）が１行に与えられます。入力は 0 で終了します。入力の数は 10 を超えません。

出力

各入力に対して n × n の魔方陣を出力して下さい。

Sample Input

3
5
0

Output for the Sample Input

4 9 2
3 5 7
8 1 6
11 24 7 20 3
4 12 25 8 16
17 5 13 21 9
10 18 1 14 22
23 6 19 2 15


import java.util

import scala.collection.mutable

object Main extends App {
  type Radian = Double
  import scala.math.{sin, cos, sqrt, Pi, acos}
  import scala.io.StdIn.{readLine}
  import Main.Angle._
  loop(readLine().toInt)
  def loop(n:Int):Unit = {
    if (n == 0) return
    val circles = Array.tabulate(n) { _ ⇒
      val Array(x, y) = readLine().split(',').map(_.toDouble)
      Circle(Coordinate(x, y))
    }
    println(circles.map { circle ⇒
      val flag = Flag.Empty
      val stack = mutable.Stack[EndPoint]()
      var overlapped: Int = 0
      for (i ← 0 until circles.size) {
        if (circle == circles(i)) {
          overlapped += 1
        } else {
          circle.CrossPoint(circles(i)) match {
            case Some((begin, end)) ⇒
              stack.push(EndPoint(Begin, i, begin), EndPoint(End, i, end))
            case _ ⇒
          }
        }
      }
      var max = 0
      var current = overlapped
      stack.sorted.foreach {
        case EndPoint(Begin, id, _) ⇒
          flag.SetFlag(id)
          current += 1
        case EndPoint(_, id, _) if flag.IsSet(id) ⇒
          flag.UnsetFlag(id)
          if (max < current) max = current
          current -= 1
        case EndPoint(_, _, _) ⇒
          if (max < current) max = current
          max += 1
      }
      if (max < current) max = current
      max
    }.max)
    loop(readLine().toInt)
  }
  sealed trait EndType
  object Begin extends EndType{
    override def toString: String = "Begin"
  }
  object End extends EndType{
    override def toString: String = "End"
  }
  case class EndPoint(endType: EndType, id:Int, angle: Angle) extends Ordered[EndPoint] {
    override def compare(that: EndPoint): Int = if (angle == that.angle) (endType, that.endType) match{
      case (Begin, End) ⇒ -1
      case (End, Begin) ⇒ 1
      case _ ⇒ 0
    } else angle.compareTo(that.angle)
  }
  case class Coordinate(x:Double, y:Double){
    def +(other:Coordinate):Coordinate = Coordinate(x + other.x, y + other.y)
    def -(other:Coordinate):Coordinate = Coordinate(x - other.x, y - other.y)
    def Length:Double = sqrt(x * x + y * y)

    override def toString: String = s"($x, $y)"
    override def equals(obj: scala.Any): Boolean = {
      obj match{
        case Coordinate(a, b) ⇒ x == a && y == b
        case _ ⇒ false
      }
    }
  }
  implicit class ImplicitCoordinateManipulator(val coordinate: Coordinate){
    def Fmap(transformer:Double => Double):Coordinate = Coordinate(transformer(coordinate.x), transformer(coordinate.y))
    def *(other:Int):Coordinate = Coordinate(coordinate.x * other, coordinate.y * other)
    def /(other:Int):Coordinate = Coordinate(coordinate.x / other, coordinate.y / other)
  }
  class Angle private (val Sin:Double, val Cos:Double) extends Ordered[Angle]{
    def +(other:Angle):Angle = new Angle(Sin * other.Cos + Cos * other.Sin, Cos * other.Cos - Sin * other.Sin)
    def -(other:Angle):Angle = new Angle(Sin * other.Cos - Cos * other.Sin, Cos * other.Cos + Sin * other.Sin)
    private def ToRadian:Radian = if (Sin >= 0) acos(Cos) else 2 * Pi - acos(Cos)
    override def compare(that: Angle): Int = ToRadian.compareTo(that.ToRadian)

    override def toString: String = s"${ToRadian * 180 / Pi}"
  }
  object Angle{
    implicit class ImplicitCoordinateAngleConverter(val coordinate:Coordinate){
      def ToAngle:Angle = new Angle(coordinate.y / coordinate.Length, coordinate.x / coordinate.Length)
    }
    implicit class ImplicitAngleCoordinateConverter(val angle: Angle){
      def ToCoordinate:Coordinate = Coordinate(angle.Cos, angle.Sin)
    }
    implicit class ImplicitRadianToAngleConverter(val rad:Radian){
      def ToAngle:Angle = new Angle(sin(rad), cos(rad))
    }
  }
  case class Circle(center:Coordinate){
    def CrossPoint(other:Circle):Option[(Angle, Angle)] = {
      (center - other.center).Length match{
        case len if len > 2 => None
        case len =>
          val angle = (other.center - center).ToAngle
          val diff = acos(len / 2).ToAngle
          val posA = angle - diff
          val posB = angle + diff
          Some((posA, posB))
      }
    }
  }
  class Flag private (private var first:Int = 0, private var second:Int = 0, private var third:Int = 0, private var forth:Int = 0){
    def SetFlag(n:Int):Unit = {
      n match{
        case _ if n > 96 ⇒ forth |= 1 << (n - 96)
        case _ if n > 64 ⇒ third |= 1 << (n - 64)
        case _ if n > 32 ⇒ second |= 1 << (n - 32)
        case _ ⇒ first |= 1 << n
      }
    }
    def IsSet(n:Int):Boolean = {
      n match{
        case _ if n > 96 ⇒ (forth & (1 << (n - 96))) != 0
        case _ if n > 64 ⇒ (third & (1 << (n - 64))) != 0
        case _ if n > 32 ⇒ (second & (1 << (n - 32))) != 0
        case _ ⇒ (first & (1 << n)) != 0
      }
    }
    def UnsetFlag(n:Int):Unit = {
      n match{
        case _ if n > 96 ⇒ forth &= ~(1 << (n - 96))
        case _ if n > 64 ⇒ third &= ~(1 << (n - 64))
        case _ if n > 32 ⇒ second &= ~(1 << (n - 32))
        case _ ⇒ first &= ~(1 << n)
      }
    }
  }
  object Flag{
    def Empty= new Flag()
  }
}

シールの重なり

1 辺の長さが 10 の正方形の折り紙に半径 1 の円形のシールを n 枚貼ります。シールは重ねて貼ることができます。シールを貼る位置の座標を読み込んで、折り紙上でもっとも多くシールが重なっている場所(シールが１枚だけでも"重なっている"とする)でのシールの枚数を出力するプログラムを作成してください。

折り紙の左下を原点とした x, y 座標を与えます。この x, y を円の中心としてシールを貼ることとします。円の中心が折り紙の外に出ることはありません。また、同一座標に複数のシールが貼られることはありません。

Input

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

n
x1,y1
x2,y2
:
xn,yn

１行目にシールの枚数 n (0 ≤ 100) が与えられます。続く n 行に、各シールの中心座標が与えられます。
xi, yi は i 枚目のシールの中心の x 座標と y 座標を表します。各値は小数点以下最大 6 桁までの数字を含む実数で与えられます。

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

Output

各データセットに対し、折り紙上で最も多くシールが重なっている場所でのシールの枚数（整数）を出力して下さい。

Sample Input

15
3.14979,8.51743
2.39506,3.84915
2.68432,5.39095
5.61904,9.16332
7.85653,4.75593
2.84021,5.41511
1.79500,8.59211
7.55389,8.17604
4.70665,4.66125
1.63470,4.42538
7.34959,4.61981
5.09003,8.11122
5.24373,1.30066
0.13517,1.83659
7.57313,1.58150
0

Output for the Sample Input

4

Hint

入力例のようにシールを貼った図です。円はシール、数字は入力例の行数を表しています。
点(2.3,4.6)では、入力例の 2 行目、3 行目、6 行目、10 行目の 4 枚のシールが重なっています。

6 と 9 のおのおのの中心の距離は 2.01293 なので、シールは重なっていません。1 と 12 のおのおのの中心の距離は 1.98231 なので、シールは重なっています。

２つの円が接しているとき（おのおのの中心の距離が 2 のとき）は、重なっているものとします。


import scala.io.StdIn.readLine

object Main extends App {
  val n = readLine.split(" ").map(_.toDouble)
  println(n(0)*n(1)/3.305785)
}

坪面積の計算

土地の面積を表現する「○○坪」という単位を聞いたことはないでしょうか？ 古来、１人の武士が１日に食べるお米を作る面積を言いました。

a［m］× b［m］の土地があります。a と b を入力し、その土地の坪面積 S［坪］を出力するプログラムを作成してください。 1 坪 = 3.305785 [m2] とし、a と b は 100 以下の整数とします。

入力

a b

１つの空白で区切られた a と b が１行に与えられる。

出力

坪面積 S を１行に出力する。0.0001 以下の誤差が許される。

入力例1

15 25

出力例1

113.437508


import scala.io.StdIn.readInt
import scala.collection.mutable.ArrayBuffer

object Main {
  def getPrice(total:Int,a:Int,b:Int,c:Int,d:Array[Array[Array[Int]]]):Int = {
    if(total==0) {
      d(a)(b)(c)=((a/5)*5*380*0.8+((a%5)*380)*1.0+(b/4)*4*550*0.85+(b%4)*550*1.0+(c/3)*3*850*0.88+(c%3)*850).toInt
      d(a)(b)(c)
    } else if(d(a)(b)(c)>0) d(a)(b)(c)
    else {
      var min = Int.MaxValue
      if(total==200 || total>=400) {
        val p = getPrice(total-200,a+1,b,c,d)
        if(p<min) min = p
      }
      if(total==300 || total>=500) {
        val q = getPrice(total-300,a,b+1,c,d)
        if(q<min) min = q
      }
      if(total==500 || total>=700) {
        val r = getPrice(total-500,a,b,c+1,d)
        if(r<min) min = r
      }
      min
    }
  }

  def main(args:Array[String]) = {
    val b = new ArrayBuffer[Int]
    var n = 0
    while({n=readInt;n}!=0) {
      val d = Array.ofDim[Int](n/200+1,n/300+1,n/500+1)
      b+=getPrice(n,0,0,0,d)
    }
    println(b.mkString("\n"))
  }
}

Discounts of Buckwheat

Aizu is famous for its buckwheat. There are many people who make buckwheat noodles by themselves.

One day, you went shopping to buy buckwheat flour. You can visit three shops, A, B and C. The amount in a bag and its unit price for each shop is determined by the follows table. Note that it is discounted when you buy buckwheat flour in several bags.

Shop A

Shop B

Shop C

Amount in a bag

200g

300g

500g

Unit price for a bag (nominal cost)

380 yen

550 yen

850 yen

Discounted units

per 5 bags

per 4 bags

per 3 bags

Discount rate

reduced by 20 %

reduced by 15 %

reduced by 12 %

For example, when you buy 12 bags of flour at shop A, the price is reduced by 20 % for 10 bags, but not for other 2 bags. So, the total amount shall be (380 × 10) × 0.8 + 380 × 2 = 3,800 yen.

Write a program which reads the amount of flour, and prints the lowest cost to buy them. Note that you should buy the flour of exactly the same amount as the given input.

Input

The input consists of multiple datasets. For each dataset, an integer a (500 ≤ a ≤ 5000, a is divisible by 100) which represents the amount of flour is given in a line.

The input ends with a line including a zero. Your program should not process for the terminal symbol. The number of datasets does not exceed 50.

Output

For each dataset, print an integer which represents the lowest cost.

Sample Input

500
2200
0

Output for the Sample Input

850
3390


import scala.io.StdIn.{readInt,readLine}

object Main {

  def main(args:Array[String]) = {
    Iterator.continually(readLine).takeWhile(_!=null).foreach { s =>
      val n = s.split("\\+")
      val m = n(1).split("=")
      val a = n(0);val b = m(0);val c = m(1)
      val range = if((a.length>1 && a(0)=='X') ||
                     (b.length>1 && b(0)=='X') ||
                     (c.length>1 && c(0)=='X')) '1' to '9' else '0' to '9'
      val result = range.find{ e =>
        BigInt(a.replace('X',e))+BigInt(b.replace('X',e)) == BigInt(c.replace('X',e))
      }.map(_.toString).getOrElse("NA")
      println(result)
    }
  }
}

覆面算

数式の一部を隠してしまって、隠した数字を探す問題を覆面算といいます。今回は、数式の中のある数字のいくつかを X で隠してしまった式を扱います。以下の数式を入力して、結果を出力するプログラムを作成してください。

数式

「数字列 + 数字列 = 数字列」の形で、1 行の単純な足し算式です。

「数字列」は、数字 0 から 9 と文字 X の並びです。

2 桁以上の「数字列」の左端の数字は 0 ではないものとします。

X は、数式全体の中で必ず 1 つ以上含まれます。

結果

覆面算の答えです。数式が成り立つ様な X の値で 0 ~ 9 のどれか 1 つです。2 つ以上の答えはないものとします。

答えがない場合、結果は“NA”としてください。

Input

複数のデータセットが与えられます。各データセットとして、X を 1 つ以上含む足し算式(空白を含まない 126 文字以内の文字列) が１行に与えられます。データセットの数は 150 を超えません。

Output

各データセットについて、覆面算の結果を１行に出力してください。数字 0 ~ 9 または NA を出力してください。

Sample Input

123+4X6=X79
12X+4X6=X79
XX22+89=X2XX

Output for the Sample Input

5
NA
1


object Main {
    val fld = Array.ofDim[Int](10)
    val ans = Array.ofDim[Int](10)

    def beam(y: Int, x: Int) = {
        val dir = List((y, x), (y - 1, x), (y, x - 1), (y + 1, x), (y, x + 1)).filter(p => 0 <= p._1 && p._1 < 10 && 0 <= p._2 && p._2 < 10)
        for(p <- dir) {
            fld(p._1) ^= (1 << p._2)
        }
    }

    def init(orig: Array[Int]) = {
        for(y <- 0 to 9) {
            fld(y) = orig(y)
            ans(y) = 0
        }
    }

    def row_flip(y: Int, bits: Int) = {
        for(x <- 0 to 9) {
            if((bits & (1 << x)) != 0) {
                beam(y, x)
                ans(y) |= (1 << x)
            }
        }
    }

    def flip(y: Int, bits: Int) = {
        row_flip(0, bits)
        for(y <- 1 to 9) row_flip(y, fld(y - 1))
    }

    def solve(orig: Array[Int]) = {
        var i = 0
        var flag = true
        while(flag) {
            init(orig)
            flip(0, i)
            if(fld(9) == 0) {
                ans.foreach(bits => println(Integer.toBinaryString(bits).reverse.padTo(10, '0').split("").mkString(" ")))
                flag = false
            }
            else flag = false
        }
    }

    def main(args:Array[String]) = {
        val sc = new java.util.Scanner(System.in)
        val n = sc.nextInt
        sc.nextLine
        for(_ <- 1 to n) {
            val orig = (1 to 10).toArray.map(_ => Integer.parseInt(sc.nextLine.split(" ").mkString("").reverse, 2))
            solve(orig)
        }
    }
}

博士の光電管

博士 : ピーター君。やったよ。

ピーター : またですか。今度はどんなくだらない発明ですか。

博士 : あの幻の素粒子アキシオンの検出器を発明したんじゃ。

ピーター : アキシオンといえば、欧州合同原子核研究機構 (CERN) をはじめとする研究者たちが血眼で追っかけているという、あれですよね。本当ですかぁ?

博士 : 本当だってばよ。細かい説明は省くが、非常に強力な磁場を内蔵する特殊な光電管が光ることによって、通過するアキシオンを検出する。

ピーター : 他 に先んじて検出すれば、小柴先生のニュートリノ検出に匹敵するノーベル賞級の研究ですよ。
これで役立たずの研究ばかりしている「ダメ研究室」などという汚名も返上できますね。

博士 : そうだとも。小柴先生の「スーパーカミオカンデ」にあやかって、この装置を、(悪口言ったら)「タダジャオカンデ」と命名した。

ピーター : ちょっと苦しいって言うか、卑屈って言うか・・・。

博士 : それはいいとして、この装置ちょっとした癖があるんじゃよ。
アキシオン粒子がある光電管を通過すると、感度の関係でその光電管と隣接する上下左右の光電管が反応する。

図1

図2

★

●

●

●

●

●

●

●

★

●

●

●

●

●

●

●

●

●

●

●

●

●

★

●

●

   →

○

○

●

○

●

○

●

○

○

○

●

●

●

○

●

●

●

○

●

●

●

○

○

○

●

●

○

○

●

○

○

★

★

○

☆

●

●

○

●

●

○

●

●

○

●

●

○

○

○

●

   →

●

●

●

●

●

●

●

●

○

●

●

○

●

●

○

○

●

●

○

●

●

○

○

○

●

ピーター : つまり、図1の左側★印の光電管を粒子が通過した場合、
右側のように点灯すると言うことですね。
(図は 5 × 5 の例。黒は消灯・白は点灯状態。以下同じ。)

博士 : また反応とは、光電管の状態が反転する。つまり消えている光電管は光り、
光っている光電管は消える。

ピーター : つまり、図2の左側の★印や☆印を粒子が通過した場合、右側のような状態になると。

博士 : これを正方形になんと 100 個 (10 × 10) 配置して待ち受けるわけだ。

ピーター : これだけの大発明、ノーベル賞選考委員会も「ホッチャオカンデ」なんて。

博士 : おぉピーター君、君も我が研究室の作風になじんできたようだね。いい感じだ。
では、早速実験を始めよう。まずはこの装置、現在ランダムに光電管が点いているので、
実験が始められるように全部消えた状態にリセットしてくれたまえ。
なあに、どの光電管にアキシオン粒子を当てれば全部消えるか考えればいいだけじゃよ。
簡単だろう?

ピーター : 考えるのはいいんですが博士。当てるためには、
幻のアキシオン粒子を発生させて打ち込める装置がないといけないんじゃないですか。

博士 : ・・・。

博士とピータ (同時に)コリャアカンデ!だははは・・・・。
ー:

ということで、本日も和気あいあいと暮れてゆく博士の研究室ですが、例によって話は全く進みそうもありません。しょうがないので、ピーター君に代わってプログラムを作成してあげてください。
プログラムは次のようなものになります。

A. 装置の光電管の状態を 10 × 10 の配列として入力します。0は消灯中、1は点灯中を表します。
0 と 1 以外のデータは含まれません。

B. 入力した装置の状態をすべて消灯にするために、アキシオン粒子を通過させる位置を計算して出力します。これは、入力と同じ 10 × 10の配列で光電管の位置を表します。「0 は通過させない」、「1 は通過させる」ことを表します。すべてを消灯する方法は必ず 1 通りだけ存在するものとします。

Input

複数のデータセットが与えられます。１行目にデータセットの数 n (n ≤ 20) が与えられます。各データセットは以下の形式で与えられます。

a1,1 a1,2 ... a1,10
a2,1 a2,2 ... a2,10
:
a10,1 a10,2 ... a10,10

ai,j は装置の i 行目 j 列目の光電管の状態を示す整数 (0 または 1) を表します。

Output

各データセットについて、粒子を通過させる位置を以下の形式で出力してください。

b1,1 b1,2 ... b1,10
b2,1 b2,2 ... b2,10
:
b10,1 b10,2 ... b10,10

bi,j は装置の i 行目 j 列目の光電管に粒子を通過させるかいなかを示す整数 (0 または 1) を表します。

Sample Input

1
0 1 0 0 0 0 0 0 0 0
1 1 1 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0
0 0 0 0 1 1 0 0 0 0
0 0 0 1 0 0 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 1 0
0 0 0 0 0 0 0 1 1 1
0 0 0 0 0 0 0 0 1 0

Output for the Sample Input

0 0 0 0 0 0 0 0 0 0
0 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 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 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0 0 0


import scala.io.StdIn.readLine

object Main {
  def getTop3() = {
    {
      for(i<-1 to 7) yield {
        val n = readLine.split(" ")
        (n(0).toInt, n(1).toDouble)
      }
    }.toList.sortBy(_._2).take(3)
  }

  def main(args:Array[String]) = {
    val x1 = getTop3
    val x2 = getTop3
    val x3 = getTop3
    val r = List(x1(0),x1(1),x2(0),x2(1),x3(0),x3(1)) ++ List(x1(2),x2(2),x3(2)).sortBy(_._2).take(2)
    r.foreach(e =>println(e._1+" "+e._2))
  }
}

陸上競技大会

陸上競技大会 200M の準決勝 3 組のレースが行われました。それぞれの組に 8 名（計 24 名）の選手が出場します。各組上位 2 位までの選手と、各組の 3 位以下の全選手の中から上位 2 名の計 8 名が決勝に進出します。

選手番号とタイムを入力とし、決勝進出者 8 名の番号とそのタイムを出力するプログラムを作成してください。

Input

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

p1 t1
p2 t2
:
p24 t24

1 行目から 8 行目に１組目の選手番号 pi (整数、1 ≤ pi ≤ 10000) とタイム ti (1/100 まで計測した実数、1 ≤ ti ≤ 100)、9 行目から 16 行目に２組目の選手番号 pi とタイム ti、17 行目から 24 行目に３組目の選手番号 pi とタイム ti が与えられます。同じ選手番号の選手、同タイムの選手はいないものとします。

Output

以下の順番で、決勝進出者の選手番号とタイムを空白区切りでそれぞれ１行に出力してください。

1 組目の 1 位の選手

1 組目の 2 位の選手

2 組目の 1 位の選手

2 組目の 2 位の選手

3 組目の 1 位の選手

3 組目の 2 位の選手

各組で 3 位以下の選手の中でタイムが 1 位の選手

各組で 3 位以下の選手の中でタイムが 2 位の選手

Sample Input

18 25.46
16 26.23
3 23.00
10 24.79
5 22.88
11 23.87
19 23.90
1 25.11
23 23.88
4 23.46
7 24.12
12 22.91
13 21.99
14 22.86
21 23.12
9 24.09
17 22.51
22 23.49
6 23.02
20 22.23
24 21.89
15 24.14
8 23.77
2 23.42

Output for the Sample Input

5 22.88
3 23.00
13 21.99
14 22.86
24 21.89
20 22.23
17 22.51
12 22.91


import scala.io.StdIn.readLine

object Main {
  def getTop3() = {
    {
      for(i<-1 to 8) yield {
        val n = readLine.split(" ")
        (n(0).toInt, n(1).toDouble)
      }
    }.toList.sortBy(_._2)
  }

  def main(args:Array[String]) = {
    val x1 = getTop3
    val x2 = getTop3
    val x3 = getTop3
    val r = List(x1(0),x1(1),x2(0),x2(1),x3(0),x3(1))
    r.foreach {e => println(e._1+" "+"%.2f".format(e._2)) }
    val r2 = (x1.drop(2) ++ x2.drop(2) ++ x3.drop(2)).sortBy(_._2)
    println(r2(0)._1 + " " + "%.2f".format(r2(0)._2))
    println(r2(1)._1 + " " + "%.2f".format(r2(1)._2))
  }
}


import scala.io.Source.stdin

object Main extends App {
  stdin.getLines.foreach { s=>
    val n = (s.toInt-1) % 39 + 1
    printf("3C%02d\n",n)
  }
}

キャンディーとクラス旗

3年C組では、平成19年11月10日の体育祭で使用する「クラス旗」を、将来のクラス会の時にも使うことにしました。そこで「クラス旗」を保管する生徒を決めるために、先生が先日差し入れてくれた大量のキャンディーを使って次のようなゲームを行うことにしました。

各生徒は生徒番号の順に１個ずつキャンディーを取ります。

一巡してもキャンディーが残っていたら、最初の生徒番号の人から順々にキャンディーを取り続けます。

最後のキャンディーを取った人が「クラス旗」を保管する生徒になります。

3年C組のクラスの人数は 39 人です。彼らの生徒番号は 3C01 から 3C39 です。例えば、キャンディーの数が 50 個の場合、クラス全員が１個目のキャンディーを取り終えると、キャンディーの残りは 11 個となります。それを再び生徒番号順に取ると、最後の 1 個は、3C11 の生徒が取ることとなります。すなわち 3C11 の生徒が「クラス旗」を保管する生徒となります。

キャンディーの個数を入力とし、「クラス旗」を保管する生徒の生徒番号を出力するプログラムを作成してください。

Input

複数のテストケースが与えられます。各テストケースは以下の形式で与えられます。各テストケースとして、キャンディーの個数を表す整数 a (1 ≤ a ≤ 10000) が１行に与えられます。入力の最後(EOF)まで処理してください。

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

Output

各テストケースごとに、「クラス旗」を保管する生徒の生徒番号（半角英数字）を１行に出力してください。

Sample Input

50
5576
5577
5578

Output for the Sample Input

3C11
3C38
3C39
3C01


object Main extends App {

  import scala.io.StdIn._

  val lines = io.Source.stdin.getLines().map{_.trim.split(' ').map(_.toDouble)}.toArray
  println(
    s"${lines.count(_(0) >= 1.1)} ${lines.count(_(1) >= 1.1)}"
  )
  println(
    s"${lines.count(i ⇒ 1.1 > i(0) && i(0) >= 0.6)} ${lines.count(i ⇒ 1.1 > i(1) && i(1) >= 0.6)}"
  )
  println(
    s"${lines.count(i ⇒ 0.6 > i(0) && i(0) >= 0.2)} ${lines.count(i ⇒ 0.6 > i(1) && i(1) >= 0.2)}"
  )
  println(
    s"${lines.count(i ⇒ 0.2 > i(0))} ${lines.count(i ⇒ 0.2 > i(1))}"
  )

  implicit class Extention[T](value :T){
    @inline
    def let[A](@inline func: T ⇒ A): A = func(value)
  }
}

視力検査

視力検査の検査結果データを入力とし、下記の視力判定表に基づいて各判定に当てはまる人数を、左右の視力別に出力するプログラムを作成してください。

判定

視力

A

1.1 以上

B

0.6 以上 1.1 未満

C

0.2 以上 0.6 未満

D

0.2 未満

Input

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

l1 r1
l2 r2
l3 r3
:
:

i 行目に i 人目の左の視力を表す実数 li と右の視力を表す実数 ri が空白区切りで与えられます。ただし、視力は 0.1 以上 2.0 以下で、 0.1 刻みで与えられます。

入力の行数は 40 を超えません。

Output

以下の形式で、判定表を出力してください。

1行目 左の視力がAの人数 右の視力がAの人数（空白区切り）

2行目 左の視力がBの人数 右の視力がBの人数（空白区切り）

3行目 左の視力がCの人数 右の視力がCの人数（空白区切り）

4行目 左の視力がDの人数 右の視力がDの人数（空白区切り）

Sample Input

1.0 1.2
0.8 1.5
1.2 0.7
2.0 2.0

Output for the Sample Input

2 3
2 1
0 0
0 0


import scala.io.StdIn.{readLine,readInt}

object Main {

  def getFee(x:Int,y:Int,h:Int,w:Int) = {
    val l = x+y+h
    if(l<=60 && w <= 2) 600
    else if(l<=80 && w<=5) 800
    else if(l<=100 && w<=10) 1000
    else if(l<=120 && w<=15) 1200
    else if(l<=140 && w<=20) 1400
    else if(l<=160 && w<=25) 1600
    else 0
  }

  def main(args:Array[String]) = {
    var n = 0
    while({n=readInt;n} != 0) {
      val sum = (1 to n).map { i =>
        val m = readLine.split(" ").map(_.toInt)
        getFee(m(0),m(1),m(2),m(3))
      }.sum
      println(sum)
    }
  }
}

宅配料金

ある宅配業者の宅配料金は大きさと重量で下表のように料金が設定されています。

A サイズ

B サイズ

C サイズ

D サイズ

E サイズ

F サイズ

大きさ

60cm以内

80cm以内

100cm以内

120cm以内

140cm以内

160cm以内

重さ

2kg以内

5kg以内

10kg以内

15kg以内

20kg以内

25kg以内

料金

600円

800円

1000円

1200円

1400円

1600円

大きさは三辺（縦、横、高さ）の和です。例えば大きさが120cmで、重さが15kg以内の荷物はＤサイズ（1,200円）となります。大きさが120cm以内でも、重さが15kgを超え、20kg以内ならばＥサイズとなります。

1日に持ち込まれた荷物の情報を入力とし、料金の総計を出力するプログラムを作成してください。なお、Ｆサイズを超えた荷物は対象外とし料金の総計には含みません。

Input

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

n
x1 y1 h1 w1
x2 y2 h2 w2
:
xn yn hn wn

１行目に荷物の個数n (1 ≤ n ≤ 10000)、続くn 行に i 番目の荷物の縦の長さ xi、横の長さ yi、高さ hi、重さ wi (1 ≤ xi, yi, hi, wi ≤ 200) が空白区切りで１行に与えられます。

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

Output

データセットごとに荷物の料金の総計を１行に出力します。

Sample Input

2
50 25 5 5
80 60 10 30
3
10 15 25 24
5 8 12 5
30 30 30 18
0

Output for the Sample Input

800
3800


import scala.io.StdIn.readLine
import scala.collection.mutable.ArrayBuffer

object Main {
  def isHamming(num:Int):Boolean = {
    var n = num
    while(n%2==0) n = n/2
    while(n%3==0) n = n/3
    while(n%5==0) n = n/5

    if(n==1) true
    else false
  }

  def main(args:Array[String]) = {
    var s = "0"
    val b = new ArrayBuffer[String]
    while({s=readLine.trim;s}!="0") {
      val n = s.split(" ").map(_.toInt)
      b+=(n(0) to n(1)).count(i=>isHamming(i)).toString
    }
    println(b.mkString("\n"))
  }
}

ハミング数

1 に 2, 3, 5 を何回か (0 回以上) かけ算して得られる数をハミング数 (Hamming numbers) と呼びます。例えば、

1

1 × 2 × 2 = 4

1 × 2 × 2 × 3 × 5 × 5 = 300

などはハミング数ですが、11, 13, 14 などはハミング数ではありません。

ハミング数はどれも 60 のべき乗を割り切る(例えば、54 は 603 = 21600 を割り切る) ので、時刻など 60 進法の計算には都合の良い数として昔から知られていました。また、楽器の調律に用いる音階の一つである純正律では、音の周波数の比が 24, 27, 30, 32, 36, 40, 45, 48 というハミング数からなる数列になります。

整数 m、n を入力とし、m 以上 n 以下のハミング数の個数を出力するプログラムを作成してください。

Input

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

各データセットとして、２つの整数 m と n (1 ≤ m, n ≤ 1000000, m ≤ n) が空白区切りで１行に与えられます。

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

Output

データセットごとに m 以上 n 以下のハミング数の個数を１行に出力します。

Sample Input

3 8
1 27
1 86
0

Output for the Sample Input

5
17
31


import scala.io.Source.stdin
import scala.collection.mutable.Queue
import scala.collection.mutable.{ Set => mSet }

object Main {
  val rgb = "rgb".toCharArray

  def main(argv: Array[String]): Unit = {
    stdin.getLines.foreach { l =>
      if (l == "0") sys.exit()

      val q = new Queue[(String, Int)]()
      q.enqueue((l, 0))
      val rgbSet = mSet(Array.fill(l.length)("r").mkString,
        Array.fill(l.length)("g").mkString,
        Array.fill(l.length)("b").mkString)

      val done = mSet[String]()

      var continue = true

      if (rgbSet.contains(l)) {
        println(0)
        continue = false
      }
      while (continue && q.length > 0) {
        val (buf, time) = q.dequeue
        val pairs = (buf.drop(1) zip buf.take(buf.length-1)).map{ case (a, b) => Array(a, b) }.zipWithIndex

        pairs.foreach { case (arr, i) =>
          if (arr(0) != arr(1)) {
            val res = buf.take(i) + convert(arr).mkString + buf.drop(i + 2)
            // 終了判定
            if (rgbSet.contains(res) && continue) {
              println(time+1)
              continue = false
            }
            if (!done.contains(res)) {
              q.enqueue(res -> (time+1))
              done += res
            }
          }
        }

        if (continue && q.length == 0) {
          println("NA")
        }
      }
    }
  }

  def convert(st: Array[Char]): Array[Char] = {
    val c = rgb.filterNot(c => st.contains(c))(0)
    Array(c, c)
  }
}

ふしぎな虫

会津生物学研究所のA博士は、とある南の島でふしぎな虫を発見しました。形は芋虫のように細長いのですが、ひとつの体節が玉のような形をしているので、糸でつないだビーズ玉のように見えます。ふしぎなのは体の色に様々なバリエーションがあることと、なかには時間がたつにつれて体の色が変っていく虫がいることでした。どの虫の体節の色も赤か緑か青のどれかに限られるようですが、1 秒ごとに体節の色が変わっていき、最後にはすべての体節が同じ色になって落ち着く場合もあれば、いつまで待ってもずっと色が変わりつづける場合もあるようでした。

調べていくうちに、ふだんはすべての体節が同じ色をしているのですが、何かに驚いたりして興奮した後は体節の色が勝手に変わってしまうことがわかりました。一度体節の色が変わってしまうと、ふたたびすべての体節が同じ色になるまではずっと色が変わり続けることがわかりました。

A博士はこの虫を何匹も捕まえて興奮させてみては、色が変わる様子を興味深く観察していましたが、やがて色が変化している最中の色の変わり方には次のような規則性があることに気がつきました。

色が変わるのは、隣り合っている色違いの 2つの体節のペア 1組だけが変わり、他の体節の色は変わらない。ただし、そのようなペアが複数あるときに、どのペアの色が変わるかはあらかじめ予測できない。

そのようなペアは、2つの体節の色のどちらでもない色に同時に変わる(たとえば、緑と赤の体節が隣り合っているときは、それらが同時に青に変わる)。

虫の色の変化を、2秒後まですべて書いたものが上の図です。図の上段のような色をした虫がいるとします。このとき、隣り合った色違いの体節のペアは 3組あるので、1秒後には中段に並べて描いた 3通りの色のどれかに変わります。1秒後に中段左側の 2つのように変わったときには、2秒後にすべての体節が緑色になることができます(図の下段の左側から 2番目)。 それに対して、1秒後に中段の1番右のように変わったときには、2秒後にすべての体節が同じ色に変わることはありません。

博士は、目の前にいる虫の体節がすべて同じ色になる可能性があるのか、あるとしたらそうなるのは最短で何秒後なのかを予測することにしました。

目の前にいる虫の体節の色の並びを入力とし、その虫の体節がすべて同じ色になるのに要する最短の時間を秒単位で出力するプログラムを作成してください。ただし、同じ色になる可能性がないときは「NA(半角英大文字)」と出力してください。また、虫の体節の色の並びは2 以上 10 以下のr(赤)、g(緑)、b(青)からなる文字列で表されます。

Input

複数のデータセットの並びが入力として与えられます。入力の終わりはゼロひとつの行で示されま
す。各データセットとして、 虫の体節の情報を表す１つの文字列が１行に与えられます。

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

Output

データセット毎に、すべての体節の色が同じになるまでに要する最小時間 (秒単位の整数) または NA を１行に出力します。

Sample Input

rbgrg
rbbgbbr
bgr
bgrbrgbr
bggrgbgrr
gbrggrbggr
rrrrr
bgbr
0

Output for the Sample Input

5
7
1
6
NA
8
0
4


import scala.math._
import scala.collection.mutable.ListBuffer

object Main {
  val sc = new java.util.Scanner(System.in)
  def main(args: Array[String]) {
    while(true) {
      val n = sc.nextInt()
      if(n == 0) return

      val l = new Array[(Int,Int)](n)
      for(i <- 0 until n) {
        val p, d1, d2 = sc.nextInt()
        l(i) = (d1+d2, p)
      }
      val ans = l.sorted.last
      println(ans._2.toString + " " + ans._1.toString)
    }

  }
}

ウォーキング

会津リバーサイドホスピタルでは、リハビリと健康増進のため、入院患者が一日二回のウォーキングを行っています。元気に退院するために、ウォーキングで体力を回復しようと頑張る人が日に日に増えきたことから、院長が「一日で一番長い距離を歩いた人にプレゼントをあげよう!」という企画を立ち上げました。

患者の数 n (1 ≤ n ≤ 10000)、それぞれの患者の番号 pi (1 ≤ pi ≤ 10000)、一回目に歩いた距離 d1i、二回目に歩いた距離 d2i (0 ≤ d1i, d2i ≤ 5000) を入力とし、歩いた距離の合計が最も長い患者の番号とその距離を出力するプログラムを作成してください。ただし、一日に歩いた距離が同じ患者はいないものとします。

Input

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

n
p1 d11 d21
p2 d12 d22
:
pn d1n d2n

入力はすべて整数で与えられます。データセットの数は50 を超えません。

Output

入力データセットごとに、最も長い合計距離を歩いた患者の番号とその歩いた距離を１行に出力します。

Sample Input

5
263 2345 2504
1 3210 1985
5000 1501 4132
10000 503 3107
51 1758 2690
3
345 5000 2396
7 3910 1590
6789 2525 3616
0

Output for the Sample Input

5000 5633
345 7396


import java.util.Scanner

import scala.collection.Searching._
import scala.annotation.tailrec
import scala.collection.immutable.{NumericRange, Queue}
import scala.collection.mutable
import scala.io.StdIn.readLine

class IUnionFind(val size: Int) {

  private case class Node(var parent: Option[Int], var treeSize: Int)

  private val nodes = Array.fill[Node](size)(new Node(None, 1))

  def union(t1: Int, t2: Int): IUnionFind = {
    if (t1 == t2) return this

    val root1 = root(t1)
    val root2 = root(t2)
    if (root1 == root2) return this

    val node1 = nodes(root1)
    val node2 = nodes(root2)

    if (node1.treeSize < node2.treeSize) {
      node1.parent = Some(t2)
      node2.treeSize += node1.treeSize
    } else {
      node2.parent = Some(t1)
      node1.treeSize += node2.treeSize
    }
    this
  }

  def connected(t1: Int, t2: Int): Boolean = t1 == t2 || root(t1) == root(t2)

  @tailrec
  private def root(t: Int): Int = nodes(t).parent match {
    case None => t
    case Some(p) => root(p)
  }
}

object Main {
  def solve(sc: => Scanner): Unit = {
    val N = sc.nextInt
    if (N != 0) {
      val ans = Array.fill(N)((sc.nextInt, sc.nextInt + sc.nextInt)).maxBy(a => a._2)
      println(ans._1 + " " + ans._2)
      solve(sc)
    }
  }

  def gcd(i: Long, j: Long): Long = {
    if (i < j) (gcd(j, i)) else (if (j == 0) (i) else (gcd(j, i % j)))
  }

  def main(args: Array[String]): Unit = {
    val sc: Scanner = new Scanner(System.in)
    solve(sc)
  }
}


import java.util.Scanner

import scala.collection.Searching._
import scala.annotation.tailrec
import scala.collection.immutable.{NumericRange, Queue}
import scala.collection.mutable
import scala.io.StdIn.readLine

class IUnionFind(val size: Int) {

  private case class Node(var parent: Option[Int], var treeSize: Int)

  private val nodes = Array.fill[Node](size)(new Node(None, 1))

  def union(t1: Int, t2: Int): IUnionFind = {
    if (t1 == t2) return this

    val root1 = root(t1)
    val root2 = root(t2)
    if (root1 == root2) return this

    val node1 = nodes(root1)
    val node2 = nodes(root2)

    if (node1.treeSize < node2.treeSize) {
      node1.parent = Some(t2)
      node2.treeSize += node1.treeSize
    } else {
      node2.parent = Some(t1)
      node1.treeSize += node2.treeSize
    }
    this
  }

  def connected(t1: Int, t2: Int): Boolean = t1 == t2 || root(t1) == root(t2)

  @tailrec
  private def root(t: Int): Int = nodes(t).parent match {
    case None => t
    case Some(p) => root(p)
  }
}

object Main {
  def solve(sc: => Scanner): Unit = {
    val N = sc.nextInt
    if (N != 0) {
      val A = Array.fill(N)(sc.nextInt).groupBy(x => x).map(x => (x._1, "*" * x._2.length))
      for (i <- Range(0, 10)) {
        println(A.getOrElse(i, "-"))
      }
      solve(sc)
    }
  }

  def gcd(i: Long, j: Long): Long = {
    if (i < j) (gcd(j, i)) else (if (j == 0) (i) else (gcd(j, i % j)))
  }

  def main(args: Array[String]): Unit = {
    val sc: Scanner = new Scanner(System.in)
    solve(sc)
  }
}

ヒストグラム

テンアイスクリームという名前のアイスクリーム屋さんがあります。このお店では常に 10 種類のアイスクリームが店頭に並ぶようにしています。お店の店長は商品開発の参考にするために、アイスクリームの売れ具合を表すグラフを毎日作成しています。

そんな店長のために、あなたは各アイスクリームの販売数をグラフで表示するプログラムを作成することになりました。

一日に販売されるアイスクリームの総数と売れたアイスクリームの番号を入力とし、アイスクリームの種類ごとに販売した数だけ * (半角アスタリスク) を出力するプログラムを作成してください。ただし、アイスクリームの種類を 0 から 9 までの整数で表わします。また、販売個数がゼロのアイスクリームは、- (半角ハイフン) をひとつ出力します。

Input

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

n
c1
c2
:
cn

1 行目に一日に販売されるアイスクリームの総数 n (1 ≤ n ≤ 10000) が与えられます。続く n 行に第 i のアイスクリームの種類 ci (0 ≤ ci≤ 9) が与えられます。

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

Output

入力データセットごとに、各アイスクリームの種類の番号順に販売数を出力します。

Sample Input

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

Output for the Sample Input

*
*
***
*
*
-
*
**
***
**
-
*
-
-
-
*
-
-
-
*


object Main extends App {

  import scala.io.StdIn._

  solve
  def solve:Unit = {
    val n = readLine.trim.toInt
    if (n == 0) return
    val words = Array.tabulate(n) { _ ⇒ readLine.trim.split(' ') }.flatten.groupBy(s ⇒ s).mapValues(_.length).toArray
    val k = readLine.head
    val filtered = words.filter(_._1.head == k)
    if (filtered.isEmpty) {
      println("NA")
    }else{
      val w = filtered.sortWith((a, b) ⇒ if (a._2 == b._2) a._1 < b._1 else a._2 > b._2).map(_._1)
      if (w.length > 5) println(w.take(5).mkString(" "))
      else println(w.mkString(" "))
    }
    solve
  }
  implicit class Extension[T](val value :T) extends AnyVal {
    @inline
    def let[A](@inline func: T ⇒ A): A = func(value)
    @inline
    def also(@inline func: T ⇒ Unit): T = {func(value); value}
  }
}

入力候補

携帯電話には、メールなどの文章を効率良く入力するために入力候補を表示する機能が搭載されています。これは、使われる頻度が高い単語を記録しておき、入力された文字を頭文字に持つ単語を入力候補として提示するものです。例えば、普段”computer”という単語を多く入力しているなら、”c”と入力するだけで候補として”computer”が提示されます。このような機能の基本部分を作成してみましょう。

文章、文字を入力とし、その文字を頭文字に持つ単語を出現数の順に出力するプログラムを作成してください。ただし、出現数が同じ単語が複数ある場合は、辞書式順序で出力します。出力する単語は最大5つまでとします。該当する単語が存在しない場合は”NA”と出力してください。

入力

複数のデータセットが与えられます。入力の終わりはゼロひとつで表されます。各データセットは以下の形式で与えられます。

n
line1
line2
:
linen
k

1行目に文章の行数 n (1 ≤ n ≤ 10) が与えられます。続く n 行に文章が与えられます。文章は半角英小文字と半角空白からなり、１行の文字数は1文字以上1024文字以下とします。空白によって区切られる単語は1文字以上20文字以下です。

続く行に頭文字 k が半角英字で与えられます。

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

出力

データセットごとに、指定された文字を頭文字にもつ単語または”NA” を出力します。

入力例

1
ben likes bananas the best among many fruits because bananas are sweet and cheap
b
1
winners get to visit aizu and the university of aizu and make many friends as well
a
3
ask alex about
the answer for the
assignment on android apps
a
2
programming is both
a sport and an intellectual puzzle
c
0

出力例

bananas because ben best
aizu and as
about alex android answer apps
NA


import scala.io.StdIn.readLine

object Main {
  def main(args:Array[String]):Unit = {
    println {
      Iterator.continually(readLine).takeWhile(_.toInt!=0).map { s=>
        var n = s
        var cnt = 0
        if(n.sortWith(_>_).toInt - n.sorted.toInt == 0) "NA"
        else {
          while(n!="6174") {
            n = "%04d".format((n.sortWith(_>_).toInt - n.sorted.toInt))
            cnt += 1
          }
          cnt
        }
      }.mkString("\n")
    }
  }
}

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

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


import scala.io.StdIn.readLine

object Main extends App {
  for(i<-1 to 7) {
    val n = readLine.split(" ").map(_.toInt)
    println(n(0)-n(1))
  }
}

気温の差

選手の皆さん、パソコン甲子園にようこそ。イベントに参加するには体調管理が大切です。気温が大きく変動する季節の変わり目には体に負担がかかり、風邪をひきやすいと言われています。一番気を付けなければいけない日は、最高気温と最低気温の差が最も大きい日です。１日の最高気温と最低気温が７日分与えられたとき、それぞれの日について最高気温から最低気温を引いた値を出力するプログラムを作成してください。

入力

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

a1 b1
a2 b2
:
a7 b7

入力は7行からなり、i行目にはi日目の最高気温 ai(-40 ≤ ai ≤ 40)と最低気温 bi(-40 ≤ bi ≤ 40)を表す整数が与えられる。すべての日において、最高気温 ai は必ず最低気温 bi 以上となっている。

出力

7日分の気温の差を7行に出力する。

入力例

30 19
39 20
19 18
25 20
22 21
23 10
10 -10

出力例

11
19
1
5
1
13
20


import java.util.Scanner

object Main {
  def solve(sc: => Scanner): Unit = {
    var N = sc.nextInt
    while (N != 0) {
      if (N != 0) {
        var z = false
        for (_ <- 0 until N) {
          if (sc.nextInt == 0) (z = true)
        }
        println(if (z) ("NA") else (N + 1))
      }
      N = sc.nextInt
      System.gc
    }
  }

  def main(args: Array[String]): Unit = {
    val sc: Scanner = new Scanner(System.in)

    solve(sc)
  }
}

おそろいの景品

ジョウ君とヤエさんは仲の良いカップルです。ジョウ君はカプセル玩具自販機(ガチャポン)の景品を集めており、二人で出かけたときも、ガチャポンを見つけると何度かやってみるほどの熱の入りようです。ヤエさんは楽しそうなジョウ君をそばで見ているだけでしたが、ジョウ君の今度の誕生日プレゼントにガチャポンの景品をひとつあげることにしました。ヤエさんはガチャポン自体にはあまり興味がわきませんでしたが、できればジョウ君とおそろいの景品が欲しいと思っています。

ヤエさんがやってみようと思うガチャポンは、１回のチャレンジで景品がひとつ出ます。品切れのものも含め景品が何種類あるのかと、それぞれの景品がいくつ残っているのかはわかります。しかし、1回のチャレンジでどの景品が出るかはわかりません。そこで、景品が出る順番にかかわらず、ヤエさんが同じ景品を必ず２つ得るために最低限必要なチャレンジの回数を出力するプログラムを作成してください。

入力

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

N
k1 k2 ... kN

各データセットは2行であり、1行目に景品が何種類あるかを表す整数N(1 ≤ N ≤ 10000)が与えられる。続く1行に各景品がいくつ残っているのかを表す整数ki(0 ≤ ki ≤ 10000)が与えられる。

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

出力

データセットごとに、同じ景品を必ず２つ得るために最低限必要なチャレンジの回数を出力する。ただし、不可能な場合はNAと出力する。

入力例

2
3 2
3
0 1 1
1
1000
0

出力例

3
NA
2

１つ目のデータセットでは、運良く１種類目か２種類目の景品が連続で出て２回で済む可能性はあるが、同じ種類の景品を必ず２つ得るためには３回チャレンジする必要がある。

２つ目のデータセットでは、２つ以上残っている景品がもともと無いので不可能である。

３つ目のデータセットでは、景品は１種類だけなので２回のチャレンジでその景品が必ず２つ得られる。


import java.util.Scanner

object Main {
  def solve(sc: => Scanner): Unit =
    println((List.fill[Int](sc.nextInt)(sc.nextInt * 60 + sc.nextInt) ::: List.fill[Int](sc.nextInt)(sc.nextInt * 60 + sc.nextInt))
          .toSeq.toList
      .sortBy(A => A)
      .map(A => ((A / 60): Int) + ":%02d".format(A % 60))
      .mkString(" "))

  def main(args: Array[String]): Unit = {
    val sc: Scanner = new Scanner(System.in)

    solve(sc)
  }
}

路線バスの時刻表

バスマニアの健次郎君は、Ａ市内のバスをよく利用しています。ある日ふと、健次郎君の家の前のバス停から出発するすべてのバスを写真に収めることを思い立ちました。このバス停には飯盛山行きと鶴ケ城行きの２つのバス路線が通ります。各路線の時刻表は手に入れましたが、１つの時刻表としてまとめた方がバス停で写真が撮りやすくなります。

健次郎君を助けるために、２つの路線の時刻表を、０時０分を基準として出発時刻が早い順に１つの時刻表としてまとめるプログラムを作成してください。

入力

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

N h1 m1 h2 m2 ... hN mN
M k1 g1 k2 g2 ... kM gM

１行目に、飯盛山行きのバスの数を表す整数 N (1 ≤ N ≤ 100) と、それに続いて飯盛山行きのバス出発時刻が早い順に与えられる。出発時刻は整数 hi (0 ≤ hi ≤ 23) と mi (0 ≤ mi ≤ 59) からなり、hi 時 mi 分に i 番目のバスが出発することを表す。２行目に、鶴ケ城行きのバスの数を表す整数 M (1 ≤ M ≤ 100) と、それに続いて鶴ケ城行きのバス出発時刻が早い順に与えられる。出発時刻は整数 ki (0 ≤ ki ≤ 23) と gi (0 ≤ gi ≤ 59) からなり、ki 時 gi 分に i 番目のバスが出発することを表す。同じ路線には、同じ時刻に出発するバスはないものとする。

出力

２つの路線の時刻表を、０時０分を基準として出発時刻が早い順に１つにまとめた時刻表を１行に出力する。ただし、同じ時刻に複数のバスが出発するときは１つだけを出力する。出発時刻の時と分を : で区切る。分が１桁のときは左に０をひとつ加えて２桁で出力する。時刻と時刻の間は空白1 つで区切る。

入出力例

入力例１

2 9 8 15 59
1 8 27

出力例１

8:27 9:08 15:59

入力例２

2 0 0 21 0
3 7 30 21 0 23 7

出力例２

0:00 7:30 21:00 23:07


import java.util.Scanner

import scala.collection.Searching._
import scala.annotation.tailrec
import scala.collection.immutable.{NumericRange, Queue}
import scala.collection.mutable
import scala.io.StdIn.readLine

class IUnionFind(val size: Int) {

  private case class Node(var parent: Option[Int], var treeSize: Int)

  private val nodes = Array.fill[Node](size)(new Node(None, 1))

  def union(t1: Int, t2: Int): IUnionFind = {
    if (t1 == t2) return this

    val root1 = root(t1)
    val root2 = root(t2)
    if (root1 == root2) return this

    val node1 = nodes(root1)
    val node2 = nodes(root2)

    if (node1.treeSize < node2.treeSize) {
      node1.parent = Some(t2)
      node2.treeSize += node1.treeSize
    } else {
      node2.parent = Some(t1)
      node1.treeSize += node2.treeSize
    }
    this
  }

  def connected(t1: Int, t2: Int): Boolean = t1 == t2 || root(t1) == root(t2)

  def root(t: Int): Int = nodes(t).parent match {
    case None => t
    case Some(p) => root(p)
  }
}

object Main {
  def solve(sc: => Scanner): Unit = {
    val N, T = sc.nextInt
    println("%.20f".format(Array.fill(N)(sc.nextDouble, sc.nextDouble).map(x => T * x._2 / x._1).max))

  }

  def gcd(i: Long, j: Long): Long = {
    if (i < j) (gcd(j, i)) else (if (j == 0) (i) else (gcd(j, i % j)))
  }

  def main(args: Array[String]): Unit = {
    val sc: Scanner = new Scanner(System.in)
    solve(sc)
  }
}

Bange Hills Tower

A project is underway to build a new viewing tower in Bange town called “Bange Hills Tower” whose selling point will be the gorgeous view of the entire main keep of Wakamatsu Castle from top to bottom. Therefore, the view line from the top of the tower must reach the bottom of the keep without being hindered by any of the buildings in the town.

Write a program to calculate the minimum tower height required to view the keep in its entirety based on the following information: the planned location of the tower and the heights and locations of existing buildings. Assume all the buildings, including the keep, are vertical lines without horizontal stretch. “view of the entire keep” means that the view line from the tower top can cover the keep from the bottom to the top without intersecting (contacts at the top are exempted) any of the other vertical lines (i.e., buildings).

Input

The input is given in the following format.

N t
x_1 h_1
x_2 h_2
:
x_N h_N

The first line provides the number of existing buildings N (1≤N≤1000) and the planned location of the tower t (2≤t≤105) in integers. Each of the subsequent N lines provides the information of the i-th building: location x_i (1 ≤ x_i < t) and height from the ground h_i (1 ≤ h_i ≤ 100). All position information is one-dimensional along the ground line whose origin coincides with the Keep location. No more than one building is located in the same location (i.e. if i ≠ j, then x_i ≠ x_j).

Output

Output the required height as a real number. No limits on the number of decimal places as long as the error does not exceed ± 10-3.

Sample Input 1

3 10
6 4
4 2
3 2

Sample Output 1

6.666667


object Main extends App {
    val in = io.Source.stdin.getLines.map(_.split(" ").map(_.toInt))
    for (Array(n) <- in if n != 0) {
        var x, y = 0
        for (Array(a, b) <- in.take(n)) {
            if(a > b) x += a+b
            else if(a < b) y += a+b
            else {x += a; y+= b}
        }
        println(x + " " + y)
    }
}

A と B の 2 人のプレーヤーが， 0 から 9 までの数字が書かれたカードを使ってゲームを行う．最初に， 2 人は与えられた n 枚ずつのカードを，裏向きにして横一列に並べる．その後， 2 人は各自の左から 1 枚ずつカードを表向きにしていき，書かれた数字が大きい方のカードの持ち主が，その 2 枚のカードを取る．このとき，その 2 枚のカードに書かれた数字の合計が，カードを取ったプレーヤーの得点となるものとする．ただし，開いた 2 枚のカードに同じ数字が書かれているときには，引き分けとし，各プレーヤーが自分のカードを 1 枚ずつ取るものとする．

例えば， A，B の持ち札が，以下の入力例 1 から 3 のように並べられている場合を考えよう．ただし，入力ファイルは n + 1 行からなり， 1 行目には各プレーヤのカード枚数 n が書かれており， i + 1 行目（i = 1，2，... ，n）には A の左から i 枚目のカードの数字と B の左から i 枚目の カードの数字が，空白を区切り文字としてこの順で書かれている．すなわち，入力ファイルの 2 行目以降は，左側の列が A のカードの並びを，右側の列が B のカードの並びを，それぞれ表している．このとき，ゲーム終了後の A と B の得点は，それぞれ，対応する出力例に示したものとなる．

　入力ファイルに対応するゲームが終了したときの A の得点と B の得点を，この順に空白を区切り文字として 1 行に出力するプログラムを作成しなさい．ただし， n ≤ 10000 とする．

入力例１

入力例２

入力例３

3

3

3

9 1

9 1

9 1

5 4

5 4

5 5

0 8

1 0

1 8

出力例１

出力例２

出力例３

19 8

20 0

15 14

入力

入力は複数のデータセットからなる．n が 0 のとき入力が終了する．データセットの数は 5 を超えない．

出力

データセットごとに、A の得点と B の得点を１行に出力する．

入力例

3
9 1
5 4
0 8
3
9 1
5 4
1 0
3
9 1
5 5
1 8
0

出力例

19 8
20 0
15 14

各データセットの出力の後（Bの得点の後）に改行を入れること。

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


object Main extends App {
  val src = io.Source.stdin.getLines.map(_.split(" ").map(_.toInt).toList)

  for (List(rows, elems) <- src if rows != 0)
    println(src.take(rows).toList
      .transpose.map(_.sum).zip(Stream from 1)
      .sortWith((tup1, tup2) => tup1._1 > tup2._1)
      .map{ case (num, idx) => idx }.mkString(" "))
}

ある学校で修学旅行へ行く計画がある.そのためにアンケート調査を行った.
生徒は 1 から n までの生徒番号を持ち,旅行候補の場所を 1 から m までの番号で表し,行きたい場所に ○,行きたくない場所に×の印をつけて提出している.

このとき, 行きたい場所の人数が多い順に,場所の番号を出力するプログラムを作成せよ.人数が同じときは,場所の番号順とする.

入力データ の 1 行目は生徒の人数 n と旅行候補の場所の数 m が空白で区切られ, i + 1 行に生徒 i のアンケート結果を ○ は 1 で×は 0 で表し,空白で区切られた m 個の数字が並んでいる.1 ≤ n ≤ 1000, 1 ≤ m ≤ 100 とする.

入力例１

4 6

1 0 1 0 1 1

1 1 0 1 0 0

1 1 1 0 0 0

1 0 1 0 1 0

出力例１

1 3 2 5 4 6

入力

入力は複数のデータセットからなる．n, m がともに 0 のとき入力が終了する．データセットの数は 5 を超えない．

出力

データセットごとに、場所の番号 を１行に出力する．

入力例

4 6
1 0 1 0 1 1
1 1 0 1 0 0
1 1 1 0 0 0
1 0 1 0 1 0
4 6
1 0 1 0 1 1
1 1 0 1 0 0
1 1 1 0 0 0
1 0 1 0 1 0
0 0

出力例

1 3 2 5 4 6
1 3 2 5 4 6

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


import scala.io.StdIn.{readInt,readLine}

object Main extends App {
  def genStr(s:String) = {
    var i = 0
    var result = ""

    while(i<s.length) {
      var c = s(i)
      var j = i
      var cnt = 0
      while(j<s.length && s(i)==s(j)) { j+=1;cnt+=1 }
      result += cnt.toString+s(i)
      i = j
    }
    result
  }
  Iterator.continually(readInt).takeWhile(_!=0).foreach { n =>
    var s = readLine
    (0 until n).foreach { _ => s = genStr(s) }
    println(s)
  }
}

0 から 9 までの数字だけで構成された文字列が与えられたとき,その文字列から次の規則に従って新しい文字列を作る操作を考える.与えられた文字列を左端から1文字ずつ順に読んで行き,同じ数字 a が r 個続いていた場合,個数 r と数字a を空白で区切らずにこの順で書き出す.与えられた文字列の右端まで読み,最後の書き出しが終わったところまでを途中何回書き出しがあったとしても全部まとめて操作1回とカウントする.2回目以降の操作は前回の操作により書き出された文字列を与えられた文字列として同様の操作を実施する.例えば “122244” という文字列が与えられた場合には左端から順に1個の1, 3個の2,2個の4なのでこの操作1回で得られる文字列は “113224” であり,“44444444444” (11 個の4)の場合には得られる文字列は “114” となる.

100 文字以下の与えられた文字列に上の操作を n 回実施した文字列を出力するプログラムを作成せよ.ただし, n ≤ 20 とする.

入力データ は 2 行からなり,1 行目に操作回数 n, 2 行目に最初の文字列が書かれている.

入力例

5

11

出力例

13112221

入力

入力は複数のデータセットからなる．n が 0 のとき入力が終了する．データセットの数は 5 を超えない．

出力

データセットごとに、指定された回数の操作を施した文字列 を１行に出力する．

入力例

5
11
5
11
0

出力例

13112221
13112221

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


import java.util.Scanner

object Main {
  def check(input: Array[Array[Int]]): Int = {
    Array.tabulate(input(0).length)(
      j => math.max(
        Array.tabulate(input.length)(i=>input(i)(j)).filter(k => 0 == k).length,
        Array.tabulate(input.length)(i=>input(i)(j)).filter(k => 1 == k).length
      )
    ).sum
  }

  def rev(num: Int, input: Array[Array[Int]]): Array[Array[Int]] = {
    Array.tabulate(input.length)(i => if ((num >> i) % 2 == 1) (Array.tabulate(input(i).length)(j => 1 - input(i)(j))) else (input(i)))
  }

  def make(input: Array[Array[Int]]): Int = {
    Array.tabulate(1 << input.length)(i => check(rev(i, input))).max
  }

  def solve(sc: Scanner): Unit = {
    val R: Int = sc.nextInt
    val C: Int = sc.nextInt
    if (R != 0 && C != 0) {
      println(make(Array.fill(R)(Array.fill(C)(sc.nextInt))))

      solve(sc)
    }
  }

  def main(args: Array[String]): Unit = {
    val sc: Scanner = new Scanner(System.in)
    solve(sc)
  }
}

おせんべい

問題

IOI製菓では，創業以来の伝統の製法で煎餅（せんべい）を焼いている．この伝統の製法は，炭火で一定時間表側を焼き，表側が焼けると裏返して，炭火で一定時間裏側を焼くというものである．この伝統を守りつつ，煎餅を機械で焼いている．この機械は縦 R (1 ≤ R ≤ 10) 行, 横 C (1 ≤ C ≤ 10000) 列の長方形状に煎餅を並べて焼く．通常は自動運転で，表側が焼けたら一斉に煎餅を裏返し裏側を焼く．

ある日，煎餅を焼いていると，煎餅を裏返す直前に地震が起こり何枚かの煎餅が裏返ってしまった．幸いなことに炭火の状態は適切なままであったが，これ以上表側を焼くと創業以来の伝統で定められている焼き時間を超えてしまい，煎餅の表側が焼けすぎて商品として出荷できなくなる．そこで，急いで機械をマニュアル操作に変更し，まだ裏返っていない煎餅だけを裏返そうとした．この機械は，横の行を何行か同時に裏返したり縦の列を何列か同時に裏返したりすることはできるが，残念なことに，煎餅を１枚ごと裏返すことはできない．

裏返すのに時間がかかると，地震で裏返らなかった煎餅の表側が焼けすぎて商品として出荷できなくなるので，横の何行かを同時に１回裏返し，引き続き，縦の何列かを同時に１回裏返して，表側を焼きすぎずに両面を焼くことのできる煎餅，つまり，「出荷できる煎餅」の枚数をなるべく多くすることにした．横の行を１行も裏返さない，あるいは，縦の列を１列も裏返さない場合も考えることにする．出荷できる煎餅の枚数の最大値を出力するプログラムを書きなさい．

地震の直後に，煎餅が次の図のような状態になったとする．黒い丸が表側が焼ける状態を，白い丸が裏側が焼ける状態を表している．

1行目を裏返すと次の図のような状態になる．

さらに， 1列目と5列目を裏返すと次の図のような状態になる．この状態では，出荷できる煎餅は9枚である．

ヒント

R の上限 10 は C の上限 10000 に比べて小さいことに注意せよ．

入力

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

入力の1行目には2つの整数 R, C (1 ≤ R ≤ 10, 1 ≤ C ≤ 10 000) が空白を区切りとして書かれている．続く R 行は地震直後の煎餅の状態を表す． (i+1) 行目 (1 ≤ i ≤ R) には， C 個の整数 ai,1, ai,2, ……, ai,C が空白を区切りとして書かれており， ai,j は i 行 j 列 の煎餅の状態を表している. ai,j が 1 なら表側が焼けることを， 0 なら裏側が焼けることを表す．

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

出力

データセットごとに，出荷できる煎餅の最大枚数を1行に出力する．

入出力例

入力例

2 5
0 1 0 1 0
1 0 0 0 1
3 6
1 0 0 0 1 0
1 1 1 0 1 0
1 0 1 1 0 1
0 0

出力例

9
15

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


object Main {
  def main(args: Array[String]): Unit = {
    val firstLine = scala.io.StdIn.readLine().split(" ");
    val n = firstLine(0).toInt
    val m = firstLine(1).toInt

    val checked = new Array[Byte](n * (n + 1) / 2)
    val one = 1.byteValue()

    System.gc();

    var count = 0
    for (mcount <- 1 to m) {
      val line = scala.io.StdIn.readLine
      val lineArray = line.split(" ");
      val a = lineArray(0).toInt
      val b = lineArray(1).toInt
      val x = lineArray(2).toInt

      var i = a * (a - 1) / 2 + b - 1
      for (p <- a to a + x) {
        for (q <- b to b + p - a) {
          if (checked(i) != one) {
            checked(i) = one
            count += 1;
          }

          i += 1
        }
        i += a - 1
      }
    }

    println(count)
  }
}

釘(Nails)

JOI くんは板に釘を刺して遊んでいる．下図のように，JOI くんは一辺N 本の正三角形の形に釘を並べて刺した．上からa 行目(1 ≤ a ≤ N) にはa 本の釘が並んでいる．そのうち左からb 本目(1 ≤ b ≤ a) の釘を(a, b) で表す．

図1: 釘の並び方（N = 5 の場合）

釘を頂点とする正三角形が，「各辺が全体の正三角形の辺のいずれかと平行で，全体の正三角形と同じ向き」であるとき，この正三角形を「よい正三角形」と呼ぶ．すなわち，「よい正三角形」とは，3 本の釘(a, b), (a + x, b), (a + x, b + x) を頂点とする正三角形のことである（ただしa, b, x は1 ≤ a < N, 1 ≤ b ≤ a, 1 ≤ x ≤ N - a) をみたす）．

JOI くんは，輪ゴムを使って，「よい正三角形」の周りを囲うことにした．

図2: 輪ゴムによる「よい正三角形」の囲い方の例

課題

正三角形の一辺に並んでいる釘の本数N と，JOI くんが持っている輪ゴムの数M と，M 本の輪ゴムによる「よい正三角形」の囲い方が与えられたとき，1 本以上の輪ゴムで囲われた釘の本数を求めるプログラムを作成せよ．

制限

2 ≤ N ≤ 5000     一辺に並んでいる釘の本数

1 ≤ M ≤ 500000 (= 5 × 105)     輪ゴムの数

入力

標準入力から以下のデータを読み込め．

1 行目には整数N, M が空白を区切りとして書かれている．N は正三角形の一辺に並んでいる釘の本数を，M はJOI くんの持っている輪ゴムの数をそれぞれ表す．

続くM 行は輪ゴムによる「よい正三角形」の囲い方の情報を表す．i + 1 行目(1 ≤ i ≤ M) には整数Ai, Bi, Xi (1 ≤ Ai < N, 1 ≤ Bi ≤ Ai, 1 ≤ Xi ≤ N - Ai) が空白を区切りとして書かれている．これは，i本目の輪ゴムは3 本の釘(Ai, Bi), (Ai + Xi, Bi), (Ai + Xi, Bi + Xi) を頂点とする「よい正三角形」を囲っていることを表す．

出力

標準出力に，1 本以上の輪ゴムに囲われている釘の本数を1 行で出力せよ．

採点基準

採点用データのうち，配点の30% 分については，M ≤ 10000 を満たす．

入出力例

入力例 1

5 2
2 2 1
2 1 3

出力例 1

12

この例は図2 のような「よい正三角形」の囲い方に対応している．この例において，(1, 1), (4, 4), (5, 5) 以外の12 本の釘が1 本以上の輪ゴムで囲われている．

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


object Main {
  def main(args: Array[String]): Unit = {
    val firstLine = scala.io.StdIn.readLine().split(" ");
    val n = firstLine(0).toInt
    val m = firstLine(1).toInt

    val checked = new Array[Byte](n * (n + 1) / 2)
    val one = 1.byteValue()

    System.gc();
    var a = 0;
    var b = 0;
    var x = 0;

    var count = 0
    for (mcount <- 1 to m) {
      val line = scala.io.StdIn.readLine
      val lineArray = line.split(" ");
      a = lineArray(0).toInt
      b = lineArray(1).toInt
      x = lineArray(2).toInt

      var i = a * (a - 1) / 2 + b - 1
      for (p <- a to a + x) {
        for (q <- b to b + p - a) {
          if (checked(i) != one) {
            checked(i) = one
            count += 1;
          }

          i += 1
        }
        i += a - 1
      }
      System.gc();
    }

    println(count)
  }
}


object Main extends App {
  import scala.io.StdIn._
  println(
    (0 until readLine.trim.toInt).map(_ ⇒ readLine.trim.split(' ').map(_.toInt)).let{a ⇒ a.indices.map(i ⇒ (0 until 3).filter(j ⇒ a.map(_(j)).count(_ == a(i)(j)) == 1).map(j ⇒ a(i)(j)).sum).mkString("\n")}
  )
  implicit class ScopeFunc[T](val value: T){
    def let[A](func: T ⇒ A): A = func(value)
    def also(func: T ⇒ Unit): T = {
      func(value)
      value
    }
  }
}

数当てゲーム (Unique number)

問題

JOI 君は友達とゲームをすることにした．このゲームには N 人のプレイヤーが参加する．1 回のゲームのルールは次のようなものである：

それぞれのプレイヤーは 1 以上 100 以下の好きな整数をカードに書いて提出する．各プレイヤーは，自分と同じ数を書いた人が他にいなかった場合，自分の書いた数と同じ得点を得る．自分と同じ数を書いた人が他にいた場合は得点を得られない．

JOI 君たちはこのゲームを 3 回行った．各プレイヤーが 3 回のゲームにおいて書いた数が与えられたとき，各プレイヤーが 3 回のゲームで得た合計得点を求めるプログラムを作成せよ．

入力

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

1 行目には整数 N (2 ≦ N ≦ 200) が書かれており，プレイヤーの人数を表す．

続く N 行のうちの i 行目 (1 ≦ i ≦ N) には 3 つの 1 以上 100 以下の整数が空白を区切りとして書かれており，それぞれ i 人目のプレイヤーが 1 回目，2 回目，3 回目のゲームで書いた数を表す．

出力

出力は N 行からなる．

i 行目 (1 ≦ i ≦ N) には i 人目のプレイヤーが 3 回のゲームで得た合計得点を表す整数を出力せよ．

入出力例

入力例 1

5
100 99 98
100 97 92
63 89 63
99 99 99
89 97 98

出力例 1

0
92
215
198
89

入力例 1 では，各プレイヤーが 3 回のゲームで得た得点の詳細は次のようになる：

プレイヤー 1： 0 + 0 + 0 = 0

プレイヤー 2： 0 + 0 + 92 = 92

プレイヤー 3： 63 + 89 + 63 = 215

プレイヤー 4： 99 + 0 + 99 = 198

プレイヤー 5： 89 + 0 + 0 = 89

入力例 2

3
89 92 77
89 92 63
89 63 77

出力例 2

0
63
63

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


import scala.io.StdIn.{readInt,readLine}

object Main {
  def euclid(m:Int,n:Int):Int = if(n==0) m else euclid(n,m%n)

  def main(args:Array[String]) = {
    val n = readInt
    val nums = readLine.split(" ").map(_.toInt)
    var gcm = nums(0)
    for(i <- 1 until n) {
      gcm = euclid(gcm,nums(i))
    }
    for(i<-1 to gcm if gcm%i==0)
      println(i)
  }
}

問題 ２

　入力ファイルの１行目に正整数 n が書いてあり，
２行目には半角空白文字１つを区切りとして，
n 個の正整数が書いてある．
n は 2 または 3 であり，
２行目に書かれているどの整数も値は 108 以下である．
これら２個または３個の数の公約数をすべて求め，
小さい方から順に1行に1個ずつ出力せよ．
自明な公約数（「１」）も出力すること．

出力ファイルにおいては，
出力の最後行にも改行コードを入れること．

入出力例

入力例１

2
75 125

出力例１

1
5
25

入力例２

3
110 22 88

出力例２

1
2
11
22

入力例３

3
66 11 3

出力例３

1

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


import scala.io.StdIn.{readInt,readLine}

object Main {
  def calc(n:Int):Int = {
    val op = readLine
    op match {
      case "+" => calc(n+readInt)
      case "-" => calc(n-readInt)
      case "*" => calc(n*readInt)
      case "/" => calc(n/readInt)
      case _ => n
    }
  }

  def main(args:Array[String]) = println(calc(readInt))
}

問題 2

　加減乗除の計算をする電卓プログラムを作りなさい．

　入力データの各行には数と記号 +, -, *, /, = のどれか1つが交互に書いてある．
１行目は数である．
演算 +, -, *, / の優先順位（乗除算 *, / を加減算 +, - よりも先に計算すること）は考えず，入力の順序で計算し，= の行になったら，計算結果を出力する．
入力データの数値は108以下の正の整数とする．
計算中および計算結果は，0または負の数になることもあるが
-108〜108 の範囲は超えない．
割り算は切り捨てとする．
したがって，100/3*3= は 99 になる．

　出力ファイルにおいては，
出力の最後の行にも改行コードを入れること．

入出力例

入力例１

1
+
1
=

出力例１

2

入力例２

10
-
21
*
5
=

出力例２

-55

入力例３

100
/
3
*
3
=

出力例３

99

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


//import java.util.Scanner

import java.io._
import java.nio.file.Files._
import java.nio.file.Path
import java.util.StringTokenizer

import scala.collection.immutable._
import scala.io.Codec

/**
  * Scala implementation of a faster java.util.Scanner
  * See: http://codeforces.com/blog/entry/7018
  */

class Scanner(reader: LineNumberReader) extends Iterable[String] with AutoCloseable {
  def this(reader: BufferedReader) = this(new LineNumberReader(reader))

  def this(reader: Reader) = this(new BufferedReader(reader))

  def this(inputStream: InputStream)(implicit codec: Codec) = this(new InputStreamReader(inputStream, codec.charSet))

  def this(path: Path)(implicit codec: Codec) = this(newBufferedReader(path, codec.charSet))

  def this(file: File)(implicit codec: Codec) = this(file.toPath)(codec)

  def this(str: String) = this(new StringReader(str))

  override def iterator: Iterator[String] = for {
    line <- Iterator.continually(reader.readLine()).takeWhile(_ != null)
    tokenizer = new StringTokenizer(line)
    tokens <- Iterator.continually(tokenizer).takeWhile(_.hasMoreTokens)
  } yield tokens.nextToken()

  private[this] var current = iterator

  def hasNext: Boolean = current.hasNext

  @inline def next(): String = current.next()

  /**
    * This is different from Java's scanner.nextLine
    * The Java one is a misnomer since it actually travel to end of current line
    * This one actually does fetch the next line
    */
  def nextLine(): String = {
    val line = reader.readLine()
    current = iterator
    line
  }

  def lineNumber: Int = reader.getLineNumber

  def nextString(): String = next()

  def nextBoolean(): Boolean = next().toBoolean

  def nextByte(radix: Int = 10): Byte = java.lang.Byte.parseByte(next(), radix)

  def nextShort(radix: Int = 10): Short = java.lang.Short.parseShort(next(), radix)

  def nextInt(radix: Int = 10): Int = java.lang.Integer.parseInt(next(), radix)

  def nextLong(radix: Int = 10): Long = java.lang.Long.parseLong(next(), radix)

  def nextBigInt(radix: Int = 10): BigInt = BigInt(next(), radix)

  def nextFloat(): Float = next().toFloat

  def nextDouble(): Double = next().toDouble

  def nextBigDecimal(): BigDecimal = BigDecimal(next())

  override def close(): Unit = reader.close()
}

class IUnionFind(val size: Int) {

  private case class Node(var parent: Option[Int], var treeSize: Int)

  private val nodes = Array.fill[Node](size)(Node(None, treeSize = 1))

  def union(t1: Int, t2: Int): IUnionFind = {
    if (t1 == t2) return this

    val root1 = root(t1)
    val root2 = root(t2)
    if (root1 == root2) return this

    val node1 = nodes(root1)
    val node2 = nodes(root2)

    if (node1.treeSize < node2.treeSize) {
      node1.parent = Some(t2)
      node2.treeSize += node1.treeSize
    } else {
      node2.parent = Some(t1)
      node1.treeSize += node2.treeSize
    }
    this
  }

  def connected(t1: Int, t2: Int): Boolean = t1 == t2 || root(t1) == root(t2)

  def root(t: Int): Int = nodes(t).parent match {
    case None => t
    case Some(p) =>
      nodes(t).parent = Some(root(p))
      nodes(t).parent.get
  }
}

object Main {
  def solve(sc: => Scanner): Unit = {
    while (sc.hasNext) {
      println(gcd(sc.nextLong(), sc.nextLong()))
    }
  }

  def getPermutation(begin: Long = 0): Stream[Long] =
    Stream.cons(begin, getPermutation(begin + 1))

  def calc(A: Array[Long]): Array[String] = {
    if (A.length == 0) Array.fill(0)("")
    else {
      val last = A.zipWithIndex.map(x => (x._1 - x._2, x._1)).takeWhile(x => x._1 == A.head).last._2
      if (last == A.head) "%d".format(A.head) +: calc(A.zipWithIndex.map(x => (x._1 - x._2, x._1)).dropWhile(x => x._1 == A.head).map(x => x._2))
      else "%d-%d".format(A.head, last) +: calc(A.zipWithIndex.map(x => (x._1 - x._2, x._1)).dropWhile(x => x._1 == A.head).map(x => x._2))
    }
  }

  var memo: Map[(Long, Long), Long] = Map[(Long, Long), Long]()

  def recursive(xyz: Array[(Long, Long, Long)], M: Long): Long = {
    if (xyz.isEmpty) M else {
      val head = xyz.head
      if (head._1 == 0) {
        if (head._2 == M)
          recursive(xyz.tail, head._3)
        else if (head._3 == M)
          recursive(xyz.tail, head._2)
        else
          recursive(xyz.tail, M)
      } else {
        if (head._2 == M)
          recursive(xyz.tail, head._3)
        else
          recursive(xyz.tail, M)
      }
    }
  }

  def recursive2(X: Set[Long], Y: Stream[Long]): Long = if (X.contains(Y.head)) X.size else recursive2(X + Y.head, Y.tail)

  def check(s: String): Boolean = {
    s.isEmpty ||
      s.startsWith("dream") && check(s.drop(5)) ||
      s.startsWith("dreamer") && check(s.drop(7)) ||
      s.startsWith("erase") && check(s.drop(5)) ||
      s.startsWith("eraser") && check(s.drop(6))
  }

  def shift(n: Long): Long = {
    if (n == 0) 0
    else if (n == 1) 1
    else shift(n - 1) << 1
  }

  def unShift(n: Long): Long = {
    if (n == 0) 0
    else unShift(n >> 1) + 1
  }

  def gcd(i: Long, j: Long): Long = {
    if (i < j) gcd(j, i)
    else if (j == 0) i
    else gcd(j, i % j)
  }

  def primeFactors(i: Long): List[Long] = primeFactors_(i, 1).sorted

  def primeFactors_(i: Long, j: Long): List[Long] = {
    if (j * j > i) List.empty else if (i % j == 0) primeFactors_(i, j + 1) ++ List[Long](j, i / j) else primeFactors_(i, j + 1)
  }

  def main(args: Array[String]): Unit = {
    val sc: Scanner = new Scanner(System.in)
    solve(sc)
  }
}

object Util {
  def getPermutation(begin: Long = 0): Stream[Long] =
    Stream.cons(begin, getPermutation(begin + 1))

  def getPrimeList: Stream[Long] =
    getPrimeListRecursive(getPermutation(begin = 2))

  private def getPrimeListRecursive(A: Stream[Long]): Stream[Long] =
    Stream.cons(A.head, getPrimeListRecursive(A.tail.filter(_ % A.head != 0)))

  def fib(a: Long = 0, b: Long = 1, mod: Long = Long.MaxValue): Stream[Long] = a #:: fib(b % mod, (a + b) % mod, mod)
}

object ArabicRoman {

  type =?>[A, B] = PartialFunction[A, B]

  val codeTable = List(
    (1000, "M"), (900, "CM"), (500, "D"), (400, "CD"), (100, "C"),
    (90, "XC"), (50, "L"), (40, "XL"), (10, "X"), (9, "IX"), (5, "V"), (4, "IV"), (1, "I"))

  val arabicToRoman: Int =?> String = {
    case src if src >= 1 && src <= 3999 =>

      def convert(left: Int, cont: String = "", code: List[(Int, String)] = codeTable): String = {
        val (unitVal, unitChar) = code.head
        left - unitVal match {
          case n if n == 0 => cont + unitChar
          case n if n > 0 => convert(n, cont + unitChar, code)
          case _ => convert(left, cont, code.tail)
        }
      }

      convert(src)
  }

  val romanToArabic: String =?> Int = {
    case src if Option(src).exists { s => {
      s.nonEmpty && """[^MDCLXVI]""".r.findFirstMatchIn(s.toUpperCase).isEmpty
    }
    } =>

      def convert(left: String, cont: Int = 0, code: List[(Int, String)] = codeTable): Int = {
        val (unitVal, unitChar) = code.head
        left.splitAt(unitChar.length) match {
          case ("", _) => cont
          case (`unitChar`, tail) => convert(tail, cont + unitVal, code)
          case _ => convert(left, cont, code.tail)
        }
      }

      convert(src.toUpperCase())
  }
}

Problem A: Greatest Common Divisor

Please find the greatest common divisor of two natural numbers. A clue is: The Euclid's algorithm is a way to resolve this task.

Input

The input file consists of several lines with pairs of two natural numbers in each line. The numbers do not exceed 100000.

The number of pairs (datasets) is less than 50.

Output

Your program has to print the greatest common divisor for each pair of input numbers. Print each result on a new line.

Sample Input

57 38
60 84

Output for the Sample Input

19
12