object Main extends App{
  io.Source.stdin.toList.map{_.toInt}.sorted.slice(0,3).foreach(println)
}

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.collection.mutable.ArrayBuffer

object Main extends App{
  val ary = ArrayBuffer[Int]()
  (1 to 10).foreach(i=> ary += io.StdIn.readInt)
  ary.sorted.slice(0,3).foreach(println)
}


import scala.io.Source.stdin

object Main {
  def main(args: Array[String]) = {
    val it = for(i <- stdin.getLines()) yield i.toInt
    it.toList
      .sorted(Ordering[Int].reverse)
      .slice(0,3)
      .foreach(println)
  }
}


import scala.io.Source.stdin

object Main {
  def main(args: Array[String]) = {
    val it = for(i <- stdin.getLines()) yield i.toInt
    it.toList
      .sorted
      .reverse
      .slice(0,3)
      .foreach(println)
  }
}


object Main extends App{

  	var list = List[Int]()
  	for (i <- 1 to 10) {
  		list = io.StdIn.readLine().toInt :: list
  	}

  	list = list.sorted.reverse

  	println(list(0) + "\n" + list(1) + "\n" + list(2))
}


import scala.io.Source.stdin

object Main extends App{
	val i = stdin.getLines().map(_.toInt).toList.sorted
		println(0 to 2)
}


import scala.io.Source.stdin

object Main extends App{
	val i = stdin.getLines().map(_.toInt).toList.sorted.reverse.slice(0,3).foreach{println}
}


import scala.io.Source.stdin

object Main {
	def main (args: Array[String]) = {
		var sum = io.StdIn.readLine()
		while(sum != null) {
			stdin.getLines()map(_.split(" ").map(_.toInt).sum.toString.length)
			sum = io.StdIn.readLine()
		}
	}
}

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


import java.util.Scanner

import scala.math.BigDecimal.RoundingMode._
object Main extends App {

  val sc = new Scanner(System.in)
  while(sc.hasNext){
    val line = sc.nextLine()
    val n =  line.split(" ").map {_.toInt}
    val a = n(0)
    val b = n(1)
    val c = n(2)
    val d = n(3)
    val e = n(4)
    val f = n(5)

    val x :BigDecimal = BigDecimal((b*f-e*c) / (b*d-a*e)).setScale(3, HALF_UP)
    val y :BigDecimal = ((c - a * x) / b).setScale(3, HALF_UP)

    println(s"$x $y")
  }
}

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


import scala.io.StdIn._
import scala.annotation.tailrec

object Main {
    def main(args: Array[String]): Unit = {
        digit(readLine().split(" ").map(_.toDouble))
    }

    @tailrec
    def digit(n: Seq[Double]): Unit = {
       val x: Double = round((n(1)*n(5) - n(4)*n(2)) / (n(1)*n(3) - n(0)*n(4)))
       val y: Double = round((n(0)*n(5) - n(2)*n(3)) / (n(0)*n(4) - n(1)*n(3)))
       println(f"$x%.3f" + " " + f"$y%.3f")
       val next: String = readLine()
       if(next == null) Unit else digit(next.split(" ").map(_.toDouble))
    }

    def round(n: Double): Double = Math.round(n * 1000) / 1000
}


import scala.io.StdIn._
import scala.annotation.tailrec

object Main {
    def main(args: Array[String]): Unit = {
        digit(readLine().split(" ").map(_.toDouble))
    }

    @tailrec
    def digit(n: Seq[Double]): Unit = {
       val x: Double = zero((n(1) * n(5) - n(4) * n(2)) / n(1) * n(3) - n(0) * n(4))
       val y: Double = zero((n(2) - n(0) * x) / n(1))
       println(f"$x%.3f $y%.3f")
       val next: String = readLine()
       if(next == null) Unit else digit(next.split(" ").map(_.toDouble))
    }

    def zero(n: Double): Double = if(n == -0) 0 else n
}


import scala.io.Source.stdin

object Main extends App {
  def gcd(m:Long,n:Long):Long = if(n==0) m else gcd(n, m % n)

  for(s <- stdin.getLines.map(_.split(" ").map(_.toLong))) {
        val g = gcd(s(0),s(1))
        println(g + " " + (s(0)/g)*s(1))
  }
}

GCD and LCM

Write a program which computes the greatest common divisor (GCD) and the least common multiple (LCM) of given a and b.

Input

Input consists of several data sets. Each data set contains a and b separated by a single space in a line. The input terminates with EOF.

Constraints

0 < a, b ≤ 2,000,000,000

LCM(a, b) ≤ 2,000,000,000

The number of data sets ≤ 50

Output

For each data set, print GCD and LCM separated by a single space in a line.

Sample Input

8 6
50000000 30000000

Output for the Sample Input

2 24
10000000 150000000


import scala.io.Source.stdin

object Main extends App {
  def gcd(m:Long,n:Long):Long = if(n==0) m else gcd(n, m % n)

  println {
    {
      for(s <- stdin.getLines.map(_.split(" ").map(_.toLong))) yield {
          val g = gcd(s(0),s(1))
          g + " " + (s(0)/g)*s(1)
      }
    }.mkString("\n")
  }
}


import scala.io.StdIn.readInt

object Main {
  def round(n:Double) = {
    val m = n % 1000
    if(m>0) n-m+1000 else n
  }

  def getDebt(n:Int,m:Double):Int = if(n==0) m.toInt else getDebt(n-1,round(m*1.05))

  def main(args:Array[String]) = {
    val y = 100000.0
    val ratio = 1.05
    val n = readInt

    println(getDebt(n,y))
  }
}

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


import scala.io.StdIn.readInt

object Main {
  def round(n:Double) = {
    val m = n % 1000
    if(m>0) n-m+1000 else n
  }

  def getDebt(n:Int,m:Double):Int = if(n==0) m.toInt else getDebt(n-1,round(m*1.05))

  def main(args:Array[String]) = println(getDebt(readInt,100000))
}


/**
  * http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0007
  */
object Main {
  def main(args: Array[String]): Unit = {
    val n = io.StdIn.readInt()
    println(calc(n, 100000))
  }

  def calc(week: Int, balance: Int): Int = {
    val Rate = BigDecimal(1.05)
    if (week > 0) {
      calc(week - 1, (balance * Rate).setScale(-3, BigDecimal.RoundingMode.UP).toInt)
    } else {
      balance
    }
  }
}


import scala.io.StdIn._
import scala.annotation.tailrec
import scala.collection._

object Main {

  class Sieve(val n: Int){
    private[this] val top = (n - 3) / 2 + 1
    private[this] val (cmpsts, sqrtLmtNdx) = (new Array[Int]((top >>> 5) + 1), (Math.sqrt(n).toInt - 3) / 2)

    def isCmpst(ci: Int): Boolean = (cmpsts(ci >>> 5) & (1 << (ci & 31))) != 0
    def setCmpst(ci: Int): Unit = cmpsts(ci >>> 5) |= 1 << (ci & 31)

    @tailrec
    private def cull(cmpstId: Int, p: Int): Unit = {
      if(cmpstId <= top){
        setCmpst(cmpstId)
        cull(cmpstId + p, p)
      }
    }

    @tailrec
    private def get(cndId: Int): Unit = {
      if(cndId <= sqrtLmtNdx){
        if(!isCmpst(cndId)){
          val p = 2 * cndId + 3
          cull((p * p - 3) >>> 1, p)
        }
        get(cndId + 1)
      }
    }

    @tailrec
    private def next(cndId: Int): Int =
      if ((cndId > top) || !isCmpst(cndId)) 2 * cndId + 3 else next(cndId + 1)

    def exec: Iterator[Int] = {
      get(0)
      Iterator.single(2) ++ Iterator.iterate(3)(p => next((p - 1) >>> 1)).takeWhile(_ <= n)
    }
  }

  @tailrec
  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.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+1 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)
    for(i<-stdin.getLines) {
      println(p.take(i.toInt).sum)
    }
  }
}


/**
  * http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0009
  * Prime Number
  */
object Main {
  def main(args: Array[String]): Unit = {
    val primes = Primes(999999)
    Iterator.continually(io.StdIn.readLine()).takeWhile(_ != null).map(_.toInt)
      .map(n => primes.count(p => p <= n))
      .foreach(println)
  }

  object Primes {

    def isPrime(n: Int): Boolean = {
      n match {
        case 2 | 3 => true
        case _ => !(2 to n).takeWhile(p => p * p <= n).exists(n % _ == 0)
      }
    }

    def apply(n: Int): Seq[Int] = {
      2 +: (3 to n by 2).filter(isPrime)
    }

  }

}


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


object Main extends App {
  def crossProduct(p1: (Double, Double, Double),
                   p2: (Double, Double, Double)): (Double, Double, Double) = {
    (
      p1._3 * p2._2 - p1._2 * p2._3,
      p1._1 * p2._3 - p1._3 * p2._1,
      p1._2 * p2._1 - p1._1 * p2._2
    )
  }

  Stream
    .continually(readLine)
    .takeWhile(_ != null)
    .map(_.split(" ").map(_.toDouble) match {
      case Array(x1, y1, x2, y2, x3, y3, xp, yp) =>
        val (ab, ap, bc, bp, ca, cp) = (
          (x2 - x1, y2 - y1, 0.0),
          (xp - x1, yp - y1, 0.0),
          (x3 - x2, y3 - y2, 0.0),
          (xp - x2, yp - y2, 0.0),
          (x1 - x3, y1 - y3, 0.0),
          (xp - x3, yp - y3, 0.0)
        )
        Seq((ab, ap), (bc, bp), (ca, cp)).map { case (p1, p2) => crossProduct(p1, p2) }
    })
    .map(_.map(_._3 > 0))
    .map(zIsPositives => zIsPositives.forall(_ == zIsPositives.head))
    .foreach(isInner => println(if (isInner) "YES" else "NO"))
}

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

A Point in a Triangle

There is a triangle formed by three points $(x_1, y_1)$, $(x_2, y_2)$, $(x_3, y_3)$ on a plain.

Write a program which prints "YES" if a point $P$ $(x_p, y_p)$ is in the triangle and "NO" if not.

Input

Input consists of several datasets. Each dataset consists of:

$x_1$ $y_1$ $x_2$ $y_2$ $x_3$ $y_3$ $x_p$ $y_p$

All the input are real numbers. Input ends with EOF. The number of datasets is less than or equal to 100.

Constraints

You can assume that:

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

1.0 $\leq$ Length of each side of a tringle

0.001 $\leq$ Distance between $P$ and each side of a triangle

Output

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

Sample Input

0.0 0.0 2.0 0.0 2.0 2.0 1.5 0.5
0.0 0.0 1.0 4.0 5.0 3.0 -1.0 3.0

Output for the Sample Input

YES
NO


import scala.io.Source.stdin

object Main {
  def switchingRailroadCars(t: Iterator[String]): Vector[Int] = {
    def loop(n: Int,
      switchList: Vector[Int] = Vector(),
      exitList: Vector[Int] = Vector()): Vector[Int] = {
      if (t.nonEmpty) {
        n match {
          case 0 => loop(t.next.toInt, switchList.init, exitList :+ switchList.last)
          case _ => loop(t.next.toInt, switchList :+ n, exitList)
        }
      } else exitList
    }

    loop(t.next.toInt)
  }

  def main(args: Array[String]): Unit = {
    val trains = stdin.getLines
    switchingRailroadCars(trains).foreach(println)
  }
}

Switching Railroad Cars

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

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

An entry of a car is represented by its number.

An exit of a car is represented by 0

For example, a sequence

1
6
0
8
10

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

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

Input

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

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

Output

For each 0, print the car number.

Sample Input

1
6
0
8
10
0
0
0

Output for the Sample Input

6
10
8
1


object Main extends App {

  Stream.continually(readLine)
    .takeWhile(_ != null)
    .map(_.toInt)
    .map(area(x => x * x))
    .foreach(println)

  def area(f: Long => Long)(d: Int): Long = {
    Range(0, 600, d).map(dd => d * f(dd.toLong)).sum
  }
}

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 {
	def nextAlphabet(c: Char) : Char = {
	  val list = "abcdefghijklmnopqrstuvwxyz".toList
	  val pos = list.indexOf(c)
	  if(list(pos) == 'z') return list(0)
	  else return list(pos+1)
	}

    def main(args:Array[String]) = {
        val sc = new java.util.Scanner(System.in)
        while(sc.hasNext){
	        val a = sc.nextLine
	        var c = a.toCharArray
            for(i <- 0 until 26){
                for(j <- 0 until c.length){
                     if (c(j) != ' ' && c(j) != '.'){
                         c(j) = nextAlphabet(c(j))
                     }
                }
                val s = new String(c)
                if(s.contains("the") || s.contains("this") || s.contains("that")) println(s)
            }
    	}
    }
}

Caesar Cipher

In cryptography, Caesar cipher is one of the simplest and most widely known encryption method. Caesar cipher is a type of substitution cipher in which each letter in the text is replaced by a letter some fixed number of positions down the alphabet. For example, with a shift of 1, 'a' would be replaced by 'b', 'b' would become 'c', 'y' would become 'z', 'z' would become 'a', and so on. In that case, a text:

this is a pen

is would become:

uijt jt b qfo

Write a program which reads a text encrypted by Caesar Chipher and prints the corresponding decoded text. The number of shift is secret and it depends on datasets, but you can assume that the decoded text includes any of the following words: "the", "this", or "that".

Input

Input consists of several datasets. Each dataset consists of texts in a line. Input ends with EOF. The text consists of lower-case letters, periods, space, and end-of-lines. Only the letters have been encrypted. A line consists of at most 80 characters.

You may assume that you can create one decoded text which includes any of "the", "this", or "that" from the given input text.

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

Output

Print decoded texts in a line.

Sample Input

xlmw mw xli tmgxyvi xlex m xsso mr xli xvmt.

Output for the Sample Input

this is the picture that i took in the trip.


import scala.io.Source.stdin

object Main extends App {
  for(s<-stdin.getLines) {
    var t:String = s
    while(!t.contains("this") && !t.contains("the") && !t.contains("that")) {
      t = t map { c => if(c.toInt >= 97 && c.toInt <= 121) (c.toInt+1).toChar else if(c==122) 'a' else c }
    }
    println(t)
  }
}


import scala.io.StdIn

object Main{
  def main(args: Array[String]){
    var list = List[Int]()

    for(in <- StdIn.readLine.split(" ").map(_.toInt)){
      list = in :: list
    }

    println(list.sorted.reverse.mkString(" "))
  }
}

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 {
	def fact(n: Int) : BigInt = n match{
	  case 0 => 1
	  case _ => n * fact(n-1)
	}

    def main(args:Array[String]) = {
        val sc = new java.util.Scanner(System.in)
        while(sc.hasNext){
            println(fact(sc.nextInt))
        }
    }
}

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((for (i <- 0 to readInt()) yield i).product) }


object Main {

    def main(args:Array[String]) = {
        val sc = new java.util.Scanner(System.in)
        val n = sc.nextInt
        while(sc.hasNext){
            val x1,y1,x2,y2,x3,y3,x4,y4 = sc.nextFloat
            if(Math.abs((x1-x2)/(y1-y2)) - ((x3-x4)/(y3-y4)) < 1e-8) 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 extends App {
  val n = readInt()
  (1 to n).foreach { i =>
    val arr = readLine().split(" ").map(_.toDouble)
    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))
    if (Math.abs((y2 - y1) * (x4 - x3) - (y4 - y3) * (x2 - x1)) < 1e-10) println("YES") else println("NO")
  }
}


import scala.util.control.Breaks

object Main {

    def main(args:Array[String]) = {
        val sc = new java.util.Scanner(System.in)
        val break = new Breaks
        break.breakable{
        	while(sc.hasNext){
	            val n = sc.nextInt
	            if(n == 0) break.break
	            var list = List.empty[Int]
	            for(_ <- 1 to n){
	            	val a = sc.nextInt
		            if(list.isEmpty) list = a :: list
		            else list = Math.max(list.take(1)(0) + a, a) :: list
	        	}
	            println(list.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.Source
import scala.annotation.tailrec

object Main{
  def main(args: Array[String]){
    val lines = for{
      in <- Source.stdin.getLines.toList
    }yield in.split(" ").toList.map(_.toInt)

    if(lines.length <= 2){
      val tup = hitAndBlow(lines.head, lines.last)
      println(tup._1 + " " + tup._2)
    }
    else{
      mulHitAndBlow(lines, List()).reverse.foreach{tup => println(tup._1 + " " + tup._2)}
    }
  }

  @tailrec
  def mulHitAndBlow(list: List[List[Int]], tupList: List[(Int, Int)]): List[(Int, Int)]={
    if(list.isEmpty) tupList
    else mulHitAndBlow(list.tail.tail, hitAndBlow(list.head, list.tail.head) :: tupList)
  }

  def hitAndBlow(list1: List[Int], list2: List[Int]): (Int, Int) ={
    val hit = numOfHit(list1, list2, 0)
    (hit, numOfBlow(list1, list2, 0) - hit)
  }

  @tailrec
  def numOfHit(list1: List[Int], list2: List[Int], n: Int): Int={
    if(list1.isEmpty) n
    else if(list1.head == list2.head) numOfHit(list1.tail, list2.tail, n + 1)
    else numOfHit(list1.tail, list2.tail, n)
  }

  @tailrec
  def numOfBlow(list1: List[Int], list2: List[Int], n: Int): Int={
    if(list2.isEmpty) n
    else if(checkBlow(list1, list2.head)) numOfBlow(list1, list2.tail, n + 1)
    else numOfBlow(list1, list2.tail, n)
  }

  def checkBlow(list1: List[Int], n :Int): Boolean = list1.contains(n)
}

Hit and Blow

Let's play Hit and Blow game. A imagines four numbers and B guesses the numbers. After B picks out four numbers, A answers:

The number of numbers which have the same place with numbers A imagined (Hit)

The number of numbers included (but different place) in the numbers A imagined (Blow)

For example, if A imagined numbers:

9 1 8 2

and B chose:

4 1 5 9

A should say 1 Hit and 1 Blow.

Write a program which reads four numbers A imagined and four numbers B chose and prints the number of Hit and Blow respectively. You may assume that the four numbers are all different and within from 0 to 9.

Input

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

a1 a2 a3 a4
b1 b2 b3 b4

, where ai (0 ≤ ai ≤ 9) is i-th number A imagined and bi (0 ≤ bi ≤ 9) is i-th number B chose.

The input ends with EOF. The number of datasets is less than or equal to 50.

Output

For each dataset, print the number of Hit and Blow in a line. These two numbers should be separated by a space.

Sample Input

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

Output for the Sample Input

1 1
3 0


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

object Main extends App {
  val map = new HashMap[String,Int]
  val s = readLine.split(" ")
  s.foreach(e => {
    if(!map.contains(e)) map.put(e,1)
    else map.put(e,map(e)+1)
  })
  val maxF = map.maxBy(_._2)._1
  val maxL = s.map(e => (e.length, e)).max._2

  println(maxF + " " + maxL)
}

English Sentence

Your task is to write a program which reads a text and prints two words. The first one is the word which is arise most frequently in the text. The second one is the word which has the maximum number of letters.

The text includes only alphabetical characters and spaces. A word is a sequence of letters which is separated by the spaces.

Input

A text is given in a line. You can assume the following conditions:

The number of letters in the text is less than or equal to 1000.

The number of letters in a word is less than or equal to 32.

There is only one word which is arise most frequently in given text.

There is only one word which has the maximum number of letters in given text.

Output

The two words separated by a space.

Sample Input

Thank you for your mail and your lectures

Output for the Sample Input

your lectures


import scala.io.StdIn.readLine

object Main {

  def sum(n:Int, s:Int, x:Int):Int = {
    if(n==1) {
      if(s >= 0 && s<=9 && s > x ) 1 else 0
    } else { for(i <- 0 to 9 if s>=i && i>x) yield sum(n-1,s-i,if(i>x) i else x) }.sum
  }

  def getSum(sb:StringBuilder):Unit = {
    val r = readLine.split(" ").map(_.toInt)

    if(r(0)==0 && r(1)==0)  print(sb.result)
    else {
      println(sum(r(0),r(1),-1))
      getSum(sb)
    }
  }

  def main(args:Array[String]) = getSum(new StringBuilder)
}

整数の和

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

1 + 2 + 3 = 6

0 + 1 + 5 = 6

0 + 2 + 4 = 6

の 3 通りとなります。

Input

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

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

Output

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

Sample Input

3 6
3 1
0 0

Output for the Sample Input

3
0


import scala.io.StdIn.readLine

object Main {
  def sum(n:Int, s:Int, x:Int):Int = {
    if(n==1) { if(s >= 0 && s<=9 && s > x ) 1 else 0 }
    else { for(i <- x+1 to (if(s<9) s else 9) ) yield sum(n-1,s-i,i) }.sum
  }

  def getSum(sb:StringBuilder):Unit = {
    val r = readLine.split(" ").map(_.toInt)

    if(r(0)==0 && r(1)==0) print(sb.result)
    else {
      println(sum(r(0),r(1),-1))
      getSum(sb)
    }
  }

  def main(args:Array[String]) = getSum(new StringBuilder)
}


import scala.io.Source.stdin
import scala.io.StdIn
import scala.util.control.Breaks

/**
  * Created by wintermaples on 2017/06/20.
  */
object Main {

  def main(args : Array[String]) : Unit = {
    val b = new Breaks
    val n = StdIn.readLine().toInt
    for (i <- 0 until n) {
      val balls = StdIn.readLine().split(" ").map(_.toInt).reverse
      var ballLine1 = List.empty[Int]
      var ballLine2 = List.empty[Int]
      var success = true
      for (j <- 0 until balls.length) {
        b.breakable {

          if (ballLine1.isEmpty) {
            ballLine1 :+= balls(j)
            b.break()
          }
          if (ballLine2.isEmpty) {
            ballLine2 :+= balls(j)
            b.break()
          }
          if (ballLine1(ballLine1.length - 1) > balls(j)) {
            ballLine1 :+= balls(j)
            b.break()
          }
          if(ballLine2(ballLine2.length - 1) > balls(j)) {
            ballLine2 :+= balls(j)
            b.break()
          }
          success = false

        }
      }
      if (success)
        println("YES")
      else
        println("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 v(x:(Double,Double),y:(Double,Double)) = (x,y) match { case ((x0,y0),(x1,y1)) => (x1-x0,y1-y0) }
  def cross(x:(Double,Double),y:(Double,Double)) = (x,y) match { case ((x0,y0),(x1,y1)) => x0*y1-x1*y0 }

  def main(args:Array[String]) = {
    val b = new StringBuilder

    for(l<-stdin.getLines.map(s=>s.split(",").map(_.toDouble))) {
      val v01 = v((l(0),l(1)), (l(2),l(3)))
      val v02 = v((l(0),l(1)), (l(4),l(5)))
      val v03 = v((l(0),l(1)), (l(6),l(7)))
      val v10 = v((l(2),l(3)), (l(0),l(1)))
      val v12 = v((l(2),l(3)), (l(4),l(5)))
      val v13 = v((l(2),l(3)), (l(6),l(7)))
      if(cross(v02, v01)*cross(v02,v03) < 0
          && cross(v13,v12)*cross(v13,v10) < 0)
        b.append("YES\n")
      else
        b.append("NO\n")
    }
    print(b.result)
  }
}

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

凸？

平面上の異なる 4 点　$A (x_a, y_a)$, $B (x_b, y_b)$, $C (x_c, y_c)$, $D(x_d, y_d)$ の座標を読み込んで、それら 4 点を頂点とした四角形 $ABCD$ に凹みがなければ YES、凹みがあれば NO と出力するプログラムを作成してください。

凹みのある四角形とは図 1 のような四角形です。

Input

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

$x_a$,$y_a$,$x_b$,$y_b$,$x_c$,$y_c$,$x_d$,$y_d$

$x_a$, $y_a$, $x_b$, $y_b$, $x_c$, $y_c$, $x_d$, $y_d$ はそれぞれ -100 以上 100 以下であり、実数で与えられます。

1 直線上に 3 つ以上点が並ぶことはないものとします。また、入力順に点を結んでいけば、四角形になる順番に点の座標が入力されるものとします。（つまり、図 2 のような形になる順番で点が与えられることはありません。)

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

Output

各データセットごとに、YES または NO を１行に出力します。

Sample Input

0.0,0.0,1.0,0.0,1.0,1.0,0.0,1.0
0.0,0.0,3.0,0.0,1.0,1.0,1.0,3.0

Output for the Sample Input

YES
NO


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)).toMap
  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(a),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 {
  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 {
      if((u to 8).exists( i=> check(m diff seq1(i),count-3,i,v))) {
        true
      } else {
        (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 extends App {
  val src: Iterator[Int] = io.Source.stdin.getLines.map(_.toInt)

  def isPrime(n: Int) = n >= 2 && (3 to math.sqrt(n).toInt by 2).forall(n%_ != 0)
  def findPrimeOver(curr: Int): Int = if (isPrime(curr)) curr else findPrimeOver(curr + 1)
  def findPrimeUnder(curr: Int): Int = if (isPrime(curr)) curr else findPrimeUnder(curr - 1)

  for (num <- src) println(s"${findPrimeUnder(num-1)} ${findPrimeOver(num+1)}")
}

素数 II

素数というのは、1 よりも大きくそれ自身か 1 でしか割りきれない整数をいいます。例えば、2 は、2 と 1 でしか割り切れないので素数ですが、12 は、12 と 1 のほかに、2, 3, 4, 6 で割りきれる数なので素数ではありません。

整数 n を入力したとき、n より小さい素数のうち最も大きいものと、n より大きい素数のうち最も小さいものを出力するプログラムを作成してください。

Input

複数のデータセットが与えられます。各データセットに n (3 ≤ n ≤ 50,000) が１行に与えられます。

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

Output

各データセットに対して、n より小さい素数のうち最大のものと、n より大きい素数のうち最小のものを１つのスペースで区切って１行に出力して下さい。

Sample Input

19
3517

Output for the Sample Input

17 23
3511 3527


import scala.io.StdIn.readLine

object Main extends App {
  println {
    readLine.replace("apple","APPLE")
      .replace("peach","apple")
      .replace("APPLE","peach")
  }
}

りんごと桃

福島県は果物の産地としても有名で、その中でも特に桃とりんごは全国でも指折りの生産量を誇っています。ところで、ある販売用の英文パンフレットの印刷原稿を作ったところ、手違いでりんごに関する記述と桃に関する記述を逆に書いてしまいました。

あなたは、apple と peach を修正する仕事を任されましたが、なにぶん面倒です。１行の英文を入力して、そのなかの apple という文字列を全て peach に、peach という文字列を全てapple に交換した英文を出力するプログラムを作成してください。

Input

英文（半角英数字、空白、記号を含む）が１行に与えられます。入力される文字列の長さは 1000 以下です。

Output

apple とpeach という文字列を交換した英文を１行に出力します。

Sample Input

the cost of one peach is higher than that of one apple.

Output for the Sample Input

the cost of one apple is higher than that of one peach.


import scala.io.StdIn

object Main{
  def main(args: Array[String]){
    val lines = Iterator.continually(StdIn.readLine).takeWhile(_ != null).toList
    lines.tail.map((x:String) => x.sorted.reverse.toInt - x.sorted.toInt).foreach(println)
  }
}

整数の差

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

Input

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

Output

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

Sample Input

2
65539010
65539010

Output for the Sample Input

96417531
96417531


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


import scala.io.Source.stdin

object Main {
  def getSum(i:Int,a:Int,b:Int,sum:Int):Int =
    if(i<0) sum else getSum(i-1,(a%b)*10,b,sum+(a/b))

  def main(args:Array[String]) = {
    stdin.getLines.foreach { s =>
      val n = s.split(" ").map(_.toInt)
      val a = if(n(0) >= n(1)) n(0)-(n(0)/n(1))*n(1) else n(0)
      println(getSum(n(2),a,n(1),0))
    }
  }
}

小数位の和

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.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(50000)
    var n = 0
    while( { n = readInt; n} != 0 ) {
      var cnt = 0
      if(p(n-2) == 1) cnt = 1
      else if(n%2==0) {
        for(i<- 3 to n/2 by 2)
          if(p(i) ==1 && p(n-i) ==1)
            cnt += 1
      }
      println(cnt)
    }
  }
}

ゴールドバッハの予想

4 以上の偶数は 2 つの素数の和で表すことができるということが知られています。これはゴールドバッハ予想といい、コンピュータの計算によりかなり大きな数まで正しいことが確かめられています。例えば、10 は、7 + 3、5 + 5 の 2 通りの素数の和で表すことができます。

整数 n を入力し、n を 2 つの素数の和で表す組み合わせ数が何通りあるかを出力するプログラムを作成してください。ただし、n は 4 以上、50,000 以下とします。また、入力される n は偶数であるとはかぎりません。

Input

複数のデータセットが与えられます。各データセットに n が１行に与えられます。n が 0 のとき入力の最後とします。データセットの数は 10,000 を超えません。

Output

各データセットに対して、n を 2 つの素数の和で表す組み合わせ数を１行に出力して下さい。

Sample Input

10
11
0

Output for the Sample Input

2
0


object Main extends App {
    val in = io.Source.stdin.getLines.map(_.trim.split(" ").map(_.toInt)).toSeq.init
    for (Array(h, m, s) <- in) {
        val x = 7200-h*3600-m*60-s
        println("%02d:%02d:%02d".format(x/3600, x/60%60, x%60))
        println("%02d:%02d:%02d".format(x/1200, x/20%60, x*3%60))
    }
}

ビデオテープ

標準録画で 120 分のビデオテープがあります。テープを完全に巻き戻した状態でビデオデッキのカウンタを 00:00:00 にし、標準録画モードで録画したところ、あるカウンタ値になりました。このカウンタ値（時、分、秒）を入力し、残りのテープの長さ（録画可能時間）を求め、時：分：秒の形式で出力するプログラムを作成して下さい。

ただし、2 時間（120分）以内の入力とします。なお、テープ残量は標準録画モードと 3 倍録画モードの場合の２通りを計算し、出力例のように時、分、秒とも 2 桁ずつ出力します。また "05" のように 10 の位が 0 の場合は、"0" をつけてください。

入力

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

T H S

T, H, S はそれぞれ時、分、秒を表す整数です。

T, H, S がすべて -1 のとき入力の終わりとします。データセットの数は 50 を超えません。

出力

各データセットごとに

1 行目に、テープの残りを標準録画した場合の録画可能時間の時、分、秒を半角コロン区切りで、

2 行目に、テープの残りを３倍録画した場合の録画可能時間の時、分、秒を半角コロン区切りで

出力して下さい。

Sample Input

1 30 0
-1 -1 -1

Output for the Sample Input

00:30:00
01:30:00


object Main extends App {
    val in = io.Source.stdin.getLines.map(_.split(" ").map(_.toInt)).toSeq.init
    for (Array(h, m, s) <- in) {
        val x = 7200-h*3600-m*60-s
        println("%02d:%02d:%02d".format(x/3600, x/60%60, x%60))
        println("%02d:%02d:%02d".format(x/1200, x/20%60, x*3%60))
    }
}


import scala.io.Source.stdin
import scala.collection.mutable.ArrayBuffer

object Main extends App {
  def to(a:Array[Int],y:Int,m:Int,d:Int) =
    (a(0)<y) || (a(0)==y && a(1)<m) || (a(0)==y && a(1)==m && a(2)<d)

  val b = new ArrayBuffer[String]

  stdin.getLines.foreach { s=>
    val n = s.split(" ").map(_.toInt)
    if(to(n,1868,9,8)) b+="pre-meiji"
    else if(to(n,1912,7,29)) b+="meiji " + (n(0)-1867) + " " + n(1) + " " + n(2)
    else if(to(n,1926,12,24)) b+="taisho " + (n(0)-1911) + " " + n(1) + " " + n(2)
    else if(to(n,1989,1,7)) b+="showa " + (n(0)-1925) + " " + n(1) + " " + n(2)
    else b+="heisei " + (n(0)-1988) + " " + n(1) + " " + n(2)
  }
  println(b.mkString("\n"))
}

西暦和暦変換

西暦で表された年月日を、元号を用いた和暦に変換し、その年月日を出力するプログラムを作成してください。入力は例に示すように 3 つの整数であり、順に西暦年、月、日です。これを、出力例に示すように変換してください。なお、明治以前の年月日が入力された場合は「pre-meiji」と表示してください。

各年号の最初の年は「元年」ではなく「１年」と出力することとします。

元号

期間

meiji

1868. 9. 8 〜 1912. 7.29

taisho

1912. 7.30 〜 1926.12.24

showa

1926.12.25 〜 1989. 1. 7

heisei

1989. 1. 8 〜

入力

複数のデータが与えられます。各データとして年、月、日を表す３つの整数が空白区切りで１行に与えられます。

入力の終わりまで処理してください。データの数は 50 を超えません。

出力

空白区切りの元号、年、月、日、または「pre-meiji」を１行に出力してください。

Sample Input

2005 9 3
1868 12 2
1868 9 7

Output for the Sample Input

heisei 17 9 3
meiji 1 12 2
pre-meiji


object Main extends App{
  import scala.io.StdIn.{readLine}
  type Operator = Option[((Int, Int) ⇒ Int, List[Char])]
  type CharParseResult = Option[(Char, List[Char])]
  type ParseResult = Option[(List[Char], List[Char])]
  type CalResult = Option[(Int, List[Char])]
  type CalMidResult = Option[(Int ⇒ Int, List[Char])]
  for (_ ← 0 until readLine().toInt){
    println(readLine().toList match {
      case value AsExpression '='::Nil ⇒ value
      case _ ⇒ ???
    })
  }
  object AsDigit{
    def unapply(arg: List[Char]):CharParseResult = arg match{
      case h::t if h.isDigit ⇒ Some(h, t)
      case _ ⇒ None
    }
  }
  object AsNumber{
    def unapply(arg: List[Char]):ParseResult = arg match{
      case digit AsDigit (number AsNumber rest) ⇒ Some(digit::number, rest)
      case digit AsDigit rest ⇒ Some(digit::Nil, rest)
      case _ ⇒ None
    }
  }
  object AsParenthesis{
    def unapply(arg: List[Char]): CalResult = arg match{
      case '(':: (result AsExpression ')':: rest)⇒ Some(result, rest)
      case _ ⇒ None
    }
  }
  object AsTerm{
    def unapply(arg: List[Char]):CalResult = arg match{
      case number AsNumber rest ⇒ Some(number.mkString.toInt, rest)
      case value AsParenthesis rest ⇒ Some(value, rest)
      case _ ⇒ None
    }
  }
  object AsHighPriorityOperator{
    def unapply(arg: List[Char]):Operator = arg match{
      case '*'::rest ⇒ Some(_ * _ , rest)
      case '/'::rest ⇒ Some(_ / _, rest)
      case _ ⇒ None
    }
  }
  object AsLowPriorityOperator{
    def unapply(arg: List[Char]):Operator = arg match{
      case '+'::rest ⇒ Some(_ + _, rest)
      case '-'::rest ⇒ Some(_ - _, rest)
      case _ ⇒ None
    }
  }
  implicit class BinomialOperator(val operator:(Int, Int) ⇒ Int){
    def <|(num:Int):Int ⇒ Int = operator(_, num)
  }
  implicit class MonomialOperator(val number:Int){
    def |>(op:Int ⇒ Int):Int = op(number)
  }
  object AsHighPriorityOperation{
    def unapply(arg: List[Char]):CalMidResult = arg match{
      case op AsHighPriorityOperator (term AsTerm (converter AsHighPriorityOperation rest)) ⇒ Some(op <| term andThen converter, rest)
      case op AsHighPriorityOperator (term AsTerm rest) ⇒ Some(op <| term, rest)
      case _ ⇒ None
    }
  }
  object AsHighPriorityPartial{
    def unapply(arg: List[Char]):CalResult = arg match{
      case term AsTerm (converter AsHighPriorityOperation rest) ⇒ Some(term |> converter, rest)
      case term AsTerm rest ⇒ Some(term, rest)
      case _ ⇒ None
    }
  }
  object AsLowPriorityOperation{
    def unapply(arg: List[Char]):CalMidResult = arg match{
      case op AsLowPriorityOperator (partial AsHighPriorityPartial (converter AsLowPriorityOperation rest)) ⇒ Some(op <| partial andThen converter, rest)
      case op AsLowPriorityOperator (partial AsHighPriorityPartial rest) ⇒ Some(op <| partial, rest)
      case _ ⇒ None
    }
  }
  object AsExpression{
    def unapply(arg: List[Char]): CalResult = arg match{
      case left AsHighPriorityPartial (right AsLowPriorityOperation rest) ⇒ Some(left |> right, rest)
      case value AsHighPriorityPartial rest ⇒ Some(value, rest)
      case _ ⇒ None
    }
  }
}

Smart Calculator

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

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

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

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

You may assume that there is no division by zero.

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

Length of the expression will not exceed 100.

-1 × 109 ≤ intermediate results of computation ≤ 109

Input

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

Output

For each datasets, prints the result of calculation.

Sample Input

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

Output for the Sample Input

-2
60


博士の暗号

博 士 : ?D-C'KOPUA

ピーター : どうしたんですか、デビッド博士? わけのわからないことを叫ぶのにはもう慣れましたが、
今日は文章にすらなっていませんよ。

博 士 : ほれ。

ピーター : なんですか? この表は......ああ、予選の問題にこんなのがありました。表を使って文字を置き換え
ると文字数が減るんですよね。まさか予選と本選で同じ問題を出して手を抜こうって気じゃないでし
ょうね。

博 士 : 逆じゃよ。

ピーター : 逆? なるほど、今度は短くした文字列を元に戻そうって問題ですか。ということは「?D-C'KOPUA」の
文字を、この表を使って「文字」から「符号」に置きかえるんですね......できましたよ。

11111 00011 11101 00010 11110 01010 01110 01111 10100 00000

博 士 : うむ。次はこれじゃ。

ピーター : そうそう、こんな表もありましたね。これを逆に使うんだから「符号」から「文字」に置き換えればいい
んですね。でも、最初は「11111」ですが表にありませんよ?

博 士 : そういうときは、もっと短くするか、後ろとつなげるかしてみるのだよ。

ピ ー タ ー : じゃあ短くして......あ、 「111」ならあります。じゃあ最初は「P」ですね。そうすると残りは「11」ですが、
これはぴったり合うのがないから次の「00011」から 1 文字借りて「110」にすればいいんですね。

博 士 : そうそう。つまり「E」だね。

ピ ー タ ー : それで残るのが「0011」なので、これも次から借りて「00111」にして「T」と......。全部できました。最
後の「0000」は捨てちゃえばいいんですよね?

博 士 : そうじゃ、よろしい。次はこれじゃ。

?D-C'?-C'-LMGZN?FNJKN- WEYN?P'QMRWLPZLKKTPOVRGDI

博 士 : さらにこれじゃ。

?P'QNPY?IXX?IXXK.BI -G?R'RPP'RPOVWDMW?SWUVG'-LCMGQ

博 士 : 仕上げにこうじゃ。

?P'QMDUEQ GADKOQ ?SWUVG'-LCMG?X?IGX,PUL.?UL.VNQQI

ピ ー タ ー : しっかし面倒だなあ。博士、今度は自分でプログラムを作って下さいよ。

ということで、博士のかわりに、上の文章を置き換えるプログラムを作成してください。

Input

複数のデータセットが与えられます。各データセットとして、１つの文字列（表に含まれる文字からなる 200 文字以下の文字列）が１行に与えられます。入力の終わりまで処理してください。データセットの数は 200 を超えません。

Output

各データセットごとに、変換後の文字列を１行に出力してください。

Sample Input

?D-C'KOPUA

Output for the Sample Input

PETER POTTER


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

object Main extends App {
  println {
    Iterator.continually(readInt).takeWhile(_!=0).map { n =>
      { for(i<-1 to n) yield {
          val t = readLine.split(" ")
          (t(0),t(1).toInt*3 + t(3).toInt*1)
        }
      }.sortWith( _._2 > _._2).map{ e => e._1 + "," + e._2 }.mkString("\n")
    }.mkString("\n\n")
  }
}

リーグ戦のスコアシート

スポーツの大会にはリーグ戦とトーナメント戦があります。サッカーのリーグ戦では勝・負・引分にそれぞれ点数を付け、その勝ち点で順位を競います。勝ち点はそれぞれ勝(3点)、負(0点)、引分(1点)です。

チーム数とリーグ戦の成績を入力とし、成績の良い順(勝ち点の多い順)に並べ替え、チーム名と勝ち点を出力するプログラムを作成してください。勝ち点が同点の場合は入力順に出力してください。

Input

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

n
name1 w1 l1 d1
name2 w2 l2 d2
:
namen wn ln dn

１行目にチーム数 n (n ≤ 10) が与えられます。続く n 行にチーム i の名前 namei (20文字以内のアルファベット)、勝の数 wi、負の数 li、引分の数 di (0 ≤ wi, li, di ≤ 9) が空白区切りで与えられます。

チーム数が 0 のとき、入力の終了とします。データセットの数は 50 を超えません。

Output

データセットごとに、並べ替えたチームのリストを出力してください。i 行目に i 番目のチームの名前と勝ち点をカンマで区切って出力してください。

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

Sample Input

4
Japan 1 0 2
Egypt 1 2 0
Canada 0 2 1
Spain 2 0 1
3
India 0 2 0
Poland 1 0 1
Italy 1 0 1
0

Output for the Sample Input

Spain,7
Japan,5
Egypt,3
Canada,1

Poland,4
Italy,4
India,0


object Main {
    def main(args:Array[String]) = {
        val sc = new java.util.Scanner(System.in)
        val n = sc.nextInt
        sc.nextLine
        for(i <- 1 to n) {
            val fld = (1 to 10).toList.map(_ => Integer.parseInt(sc.nextLine.split(" ").mkString("").reverse, 2))
            solve(0, 0, Nil, fld, Nil).foreach(bits => println(Integer.toBinaryString(bits).reverse.padTo(10, '0').split("").mkString(" ")))
        }
    }

    def beam(y: Int, x: Int, fld: List[Int]): List[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)
        dir.foldLeft(fld)((acc, p) => flip(acc, p._1, p._2) )
    }

    def flip(fld: List[Int], y: Int, x: Int): List[Int] = {
        val bits = fld(y) ^ (1 << x)
        (0 to 9).toList.map((i) => if(i == y) bits else fld(i))
    }

    def holizontal(y: Int, x: Int, bits: Int, acc: Int, fld: List[Int]): (Int, List[Int]) = {
        if(x == 10) (acc, fld)
        else {
            if((bits & (1 << x)) != 0) holizontal(y, x + 1, bits, acc + (1 << x), beam(y, x, fld))
            else holizontal(y, x + 1, bits, acc, fld)
        }
    }

    def solve(bits: Int, y: Int, ans: List[Int], fld: List[Int], nfld: List[Int]): List[Int] = {
        if(y == 0) {
            val ret = holizontal(0, 0, bits, 0, fld)
            solve(bits, y + 1, List(ret._1), fld, ret._2)
        }
        else if(bits == 1024) {
            println("no ans")
            ans
        }
        else if(y == 10) if(nfld(9) == 0) ans else solve(bits + 1, 0, Nil, fld, nfld)
        else {
            val ret = holizontal(y, 0, nfld(y-1), 0, nfld)
            solve(bits, y + 1, ans ::: List(ret._1), fld, ret._2)
        }
    }
}

博士の光電管

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

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

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

ピーター : アキシオンといえば、欧州合同原子核研究機構 (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


object Main {
    val fld = Array.ofDim[Int](10)
    val ans = Array.ofDim[Int](10)
    val my = List(0, -1,  0, 1, 0)
    val mx = List(0,  0, -1, 0, 1)
    def beam(y: Int, x: Int) = {
        val target = my.zip(mx).map(mv => (mv._1 + y, mv._2 + x))
            .filter(p => 0 <= p._1 && p._1 < 10 && 0 <= p._2 && p._2 < 10)
        for(p <- target) {
            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 i += 1
        }
    }

    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)
        }
    }
}


import scala.io.StdIn.readInt

object Main extends App {
  val n = readInt
  for(i <- 1 to n) {
    var m = readInt

    println("Case " + i + ":")
    for(j <- 1 to 10){
      m = "%08d".format(m*m).substring(2,6).toInt
      println(m)
    }
  }
}

平方採中法

古典的な乱数生成方法の一つである平方採中法のプログラムを作成します。平方採中法は、フォンノイマンによって 1940 年代半ばに提案された方法です。

平方採中法は、生成する乱数の桁数を n としたとき、初期値 s の2乗を計算し、その数値を 2n 桁の数値とみて、（下の例のように 2 乗した桁数が足りないときは、0 を補います。）その中央にある n 個の数字を最初の乱数とします。次にこの乱数を 2 乗して、同じ様に、中央にある n 個の数字をとって、次の乱数とします。例えば、123 を初期値とすると

1232 = 00015129 → 0151
1512 = 00022801 → 0228
2282 = 00051984 → 0519
5192 = 00269361 → 2693
26932 = 07252249 → 2522

の様になります。この方法を用いて、初期値 s（10000未満の正の整数）を入力とし、n = 4 の場合の乱数を 10 個生成し出力するプログラムを作成してください。

Input

複数のデータセットが与えられます。１行目にデータセットの数 d (d ≤ 10) が与えられます。各データセットとして、１行に初期値 s（整数、1 ≤ s < 10000）が与えられます。

Output

各データセットに対して、

Case x: (x は 1 から始まるデータセット番号)
１個目の生成した乱数（整数）
２個目の生成した乱数（整数）
：
：
１０個目の生成した乱数（整数）

を出力してください。

Sample Input

2
123
567

Output for the Sample Input

Case 1:
151
228
519
2693
2522
3604
9888
7725
6756
6435
Case 2:
3214
3297
8702
7248
5335
4622
3628
1623
6341
2082


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)
    println(r.map(e =>e._1+" "+e._2).mkString("\n"))
  }
}

陸上競技大会

陸上競技大会 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.math._
import scala.collection.mutable.ListBuffer

object Main {
  //rt.gc()??§??¬??????????????¬?????????????????????
  //val rt = Runtime.getRuntime()
  val sc = new java.util.Scanner(System.in)
  def isPrime(n: Int): Boolean =  {
    if(n == 1) {
      return false
    }
    var i = 2
    while(i*i <= n) {
      if(n % i == 0) {
        return false
      }
      i += 1
    }
    return true
  }
  def twinPrime(n: Int) = {
    var ans = (3,5)
    for(i <- 5 to n) {
      if(isPrime(i) && isPrime(i-2)) {
        ans = (i-2, i)
      }
    }
    ans
  }
  def main(args: Array[String]) {
    while(true) {
      val n = sc.nextInt
      if(n == 0) {
        return
      }
      val (p, q) = twinPrime(n)
      println(p + " " + q)
    }
  }
}

Twin Prime

Prime numbers are widely applied for cryptographic and communication technology.
A twin prime is a prime number that differs from another prime number by 2.
For example, (5, 7) and (11, 13) are twin prime pairs.

In this problem, we call the greater number of a twin prime "size of the twin prime."

Your task is to create a program which reads an integer n and prints a twin prime which has the maximum size among twin primes less than or equals to n

You may assume that 5 ≤ n ≤ 10000.

Input

The input is a sequence of datasets. The end of the input is indicated by a line containing one zero. Each dataset is formatted as follows:

n (integer)

Output

For each dataset, print the twin prime p and q (p < q). p and q should be separated by a single space.

Sample Input

12
100
200
300
0

Output for the Sample Input

5 7
71 73
197 199
281 283


object Main extends App {

  import scala.io.StdIn._
  solve
  def solve: Unit = {
    val n = readLine.trim.toInt
    if (n != 0){
      val buildings = Array.tabulate(n){_ ⇒
        val Array(b, x, y) = readLine.trim.split(' ').map(_.toInt)
        new Building(b, Coordinate(x, y))
      }.sortBy(_.id)
      val memo = Array.tabulate(n){_ ⇒ Array.tabulate(n){_ ⇒new Route(-1, Double.MaxValue)}}
      val networks = calNetwork(buildings)
      for (from ← networks.indices){
        memo(from)(from).distance = 0
        for (to ← networks(from)){
          memo(from)(to) = new Route(to, buildings(from).distance(buildings(to)))
          memo(to)(from) = new Route(from, buildings(to).distance(buildings(from)))
        }
      }
      for (a ← 0 until n){
        for (i ← 0 until n){
          for (j ← 0 until n){
            if (memo(i)(j).distance - memo(i)(a).distance > memo(a)(j).distance) {
              memo(i)(j) = new Route(memo(i)(a).from, memo(i)(a).distance + memo(a)(j).distance)
            }
          }
        }
      }
      for (_ ← 0 until readLine.trim.toInt){
        val Array(s, g) = readLine.trim.split(' ').map(_.toInt - 1)
        var stack = g::Nil
        while (memo(stack.head)(s).from != -1){
          stack ::= memo(stack.head)(s).from
        }
        println (if (stack.head == s) stack.map(_ + 1).mkString(" ") else "NA")
      }
      solve
    }
  }
  class Route(var from: Int, var distance: Double)
  def calNetwork(buildings: Array[Building]): Array[List[Int]] = {
    val res = Array.tabulate(buildings.length){_ ⇒ Nil: List[Int]}
    for (i ← buildings.indices){
      for (j ← buildings.indices){
        if (i != j && buildings(i).canJumpTo(buildings(j))) {
          res(i) ::= j
        }
      }
    }
    res
  }
  case class Coordinate(x: Int, y: Int) {
    def - (that: Coordinate): Coordinate = Coordinate(this.x - that.x, this.y - that.y)
  }
  class Building(val id: Int, val position: Coordinate)
  {
    def canJumpTo(that: Building): Boolean = (this.position - that.position).let(it ⇒ it.x * it.x + it.y * it.y <= 50 * 50)
    def distance(that: Building): Double = (this.position - that.position).let(it ⇒ math.sqrt(it.x * it.x + it.y * it.y))
  }
  implicit class ScopeFunc[T](val value:T){
    def let[A](func: T ⇒ A): A = func(value)
  }
}

スパイダー人

正義のヒーロー「スパイダー人」は、腕からロープを出してビルからビルへ飛び移ることができます。しかし、ロープが短いので自分からの距離が 50 以下のビルにしか移動できません。それより遠くのビルに移動するには、一旦別のビルに飛び移らなくてはなりません。

ビルの数 n、n 個のビルの情報、スパイダー人の移動開始位置及び目的地を入力とし、その移動の最短経路を出力するプログラムを作成してください。どのようにビルを経由しても目標のビルに移動できない場合は NA と出力してください。各ビルは点として扱い、最短距離で移動するビルの経由方法が２つ以上存在することはないものとします。

Input

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

n
b1 x1 y1
b2 x2 y2
:
bn xn yn
m
s1 g1
s2 g2
:
sm gm

１行目にビルの数 n (1 ≤ n ≤ 100)、続く n 行に i 番目のビルのビル番号 bi (1 ≤ bi ≤ n)、そのビルのx座標とy座標を表す整数 xi, yi (-1000 ≤ xi, yi ≤ 1000) が空白区切りで与えられます。

続く行に移動情報の個数 m (1 ≤ m ≤ 100)、続く m 行にi 番目の移動情報が与えられます。各移動情報として、移動を開始するビルの番号 si と目的地ビルの番号 gi が空白区切りで与えられます。

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

Output

入力データセットごとに次の形式で出力します。

i 行目に i 番目の移動情報に対する経路または NA を１行に出力します。各経路は以下の形式で出力します。

si bri1 bri2 ... gi

brij は i 番目の移動情報における、j 番目に経由するビルの番号を表します。

Sample Input

4
1 0 0
2 30 0
3 60 40
4 0 60
2
1 3
1 4
22
1 0 0
2 150 40
3 30 20
4 180 150
5 40 80
6 130 130
7 72 28
8 172 118
9 50 50
10 160 82
11 90 105
12 144 131
13 130 64
14 80 140
15 38 117
16 190 90
17 60 100
18 100 70
19 130 100
20 71 69
21 200 110
22 120 150
1
1 22
0

Output for the Sample Input

1 2 3
NA
1 3 9 20 11 6 22


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

object Main {
  def main(args:Array[String]) = {
    var n = 0
    while({n=readInt;n}!=0) {
      val a = readLine.split(" ").map(_.toInt)
      var rem = 32
      var i = 0
      while(rem!=0) {
        rem = rem - (rem-1)%5
        println(rem)
        rem = rem - (if(a(i%n)<=rem) a(i%n) else rem)
        println(rem)
        i += 1
      }
    }
  }
}

おはじき取り

一郎君と次郎君の兄弟は家でよくおはじき取りをして遊びます。おはじき取りは、一カ所に積まれた複数のおはじきを二人が交互にとっていくゲームです。一度に1〜4個のおはじきを好きな数だけ順に取り、相手に最後の1個を取らせた方が勝ちになります。二人はいつも 32 個のおはじきを使い、兄である一郎君の番からゲームを始めます。

これまでに何度も戦っている二人ですが、次郎君は兄の一郎君にどうしても勝つことができません。それもそのはず、一郎君はこのゲームの必勝法を知っているからです。一郎君は、残りのおはじきの数を n とすると、必ず (n - 1) % 5 個のおはじきを取ります。ここで x % y は、x を y で割った余りを示します。

一方、次郎君は、残りのおはじきの数にかかわらず、ゲームのはじめに各回で取るおはじきの数を数列として決めてしまうのです。例えば、次郎君が決めた数列が{ 3, 1, 4, 2 } であるならば、彼の取るおはじきの数は順に 3 -> 1 -> 4 -> 2 -> 3 -> 1 -> 4 -> … となります（取ると決めた数が、おはじきの残りの数以上になった場合は、残りのおはじき全てを取ります）。

なんど負けてもやり方を変えようとしない頑固な次郎君の将来が心配になったお母さんは、次郎君がいかなる数列を選んだとしても一郎君には勝てないということを示すために、ゲームをシュミレートするプログラムを書くことにしました。

次郎君の考えた数列 a を入力とし、一郎君と次郎君が順次おはじきを取った後の残りのおはじきの個数を出力するプログラムを作成してください。

Input

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

n
a1 a2 ... an

１行目に次郎君の決めた数列の長さ n (1 ≤ n ≤ 25)、２行目に数列の i 番目の要素 ai (1 ≤ ai ≤ 4) が空白区切りで与えられます。入力はすべて整数で与えられます。

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

Output

データセットごとに、ゲームの各回でのおはじきが取られた直後のおはじきの数（整数）を出力します。

Sample Input

4
3 1 4 2
3
4 3 2
0

Output for the Sample Input

31
28
26
25
21
17
16
14
11
8
6
5
1
0
31
27
26
23
21
19
16
12
11
8
6
4
1
0


import java.util.Scanner

object Main {
  def solve(sc: => Scanner): Unit = {
    while (sc.hasNext) {
      val name = sc.next
      val a, b = sc.nextInt
      println(name + " " + (a + b) + " " + (a * 200 + b * 300))
    }
  }

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

お化け屋敷

会津学園高等学校では、毎年学園祭をおこなっています。その中でも一番人気はお化け屋敷です。一番人気の理由は、お化け屋敷をおこなうクラスが 1クラスや 2クラスではなく、9クラスがお化け屋敷をおこなうことです。それぞれが工夫することより、それぞれが個性的なお化け屋敷になっています。そのため、最近では近隣から多くの来場者が訪れます。

そこで、学園祭実行委員会では、お化け屋敷の入場料金を下表のように校内で統一し、これにもとづき各クラスごとに入場者総数と収入の集計をおこなうことにしました。

入場料金表(入場者 1人あたりの入場料)

午前 午後
200円 300円

各クラス毎の午前と午後の入場者数を入力とし、各クラス毎の入場者総数及び収入の一覧表を作成するプログラムを作成してください。

Input

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

name1 a1 b1
name2 a2 b2
:
name9 a9 b9

入力は９行からなり、i 行目に第 i のクラスのクラス名 namei (数字とアルファベットを含む 1 文字以上 15 文字以下の半角文字列)、午前の入場者数 ai (0 ≤ ai ≤ 400)、 午後の入場者数 bi (0 ≤ bi ≤ 400) が与えられます。

Output

i 行目に第 i のクラスのクラス名、 入場者総数、 料金収入を空白区切りで１行に出力してください。

Sample Input

1a 132 243
1c 324 183
1f 93 199
2b 372 163
2c 229 293
2e 391 206
3a 118 168
3b 263 293
3d 281 102

Output for the Sample Input

1a 375 99300
1c 507 119700
1f 292 78300
2b 535 123300
2c 522 133700
2e 597 140000
3a 286 74000
3b 556 140500
3d 383 86800


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") return
      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)) {
              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.io.StdIn.{readInt,readLine}

object Main extends App {
  def eval(math:Int,eng:Int,jp:Int) = {
    if(math == 100 || eng == 100 || jp == 100) "A"
    else if((math+eng)/2 >= 90) "A"
    else if((math+eng+jp)/3 >= 80) "A"
    else if((math+eng+jp)/3 >= 70) "B"
    else if((math+eng+jp)/3 >= 50 && (math >= 80 || eng >= 80)) "B"
    else "C"
  }

  println {
    Iterator.continually(readInt).takeWhile(_ != 0).map { n =>
      {
        for(i<- 1 to n) yield {
          val score = readLine.split(" ").map(_.toInt)
          eval(score(0),score(1),score(2))
        }
      }.mkString("\n")
    }.mkString("\n")
  }
}

クラス分け

会津進学塾では、生徒が塾に入る際に実力テストを行ってクラス分けをします。テストは数学、英語、国語の 3 科目行い、生徒を A,B,C クラスにクラス分けします。A クラスのレベルが一番高く、順に低くなっていきます。

クラス分けの判断は以下の表に基づきます。

条件

クラス

100 点の科目がある

A

数学と英語の平均点が 90 点以上

A

3 科目の平均点が 80 点以上

A

3 科目の平均点が 70 点以上

B

3 科目の平均点が 50 点以上で数学か英語が 80 点以上

B

上の条件を満たさない

C

複数の条件を満たす場合は、よりレベルの高いクラスに分けられます。

生徒の人数 n (1 ≤ n ≤ 10000)、各生徒の数学の点数 pmi (0 ≤ pmi ≤ 100)、英語の点数 pei (0 ≤ pei ≤ 100)、国語の点数 pji (0 ≤ pji ≤ 100) を入力とし、各生徒のクラスA,B,C (半角英字) を出力するプログラムを作成してください。

Input

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

n
pm1 pe1 pj1
pm2 pe2 pj2
:
pmn pen pjn

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

Output

入力データセットごとに、各生徒のクラスを順番に出力します。

Sample Input

4
100 70 20
98 86 55
80 34 36
65 79 65
2
99 81 20
66 72 90
0

Output for the Sample Input

A
A
B
C
A
B


import scala.io.StdIn.{readInt,readLine}
import scala.collection.mutable.ArrayBuffer

object Main {
  def main(args:Array[String]) = {
    var n = 0
    while( {n=readInt;n} != 0 ) {
      val b = new ArrayBuffer[Array[Int]]
      for(i<-1 to n) {
        b += readLine.split(" ").map(_.toInt)
      }
      val limit = readLine.split(" ").map(_.toInt)
      val p = limit(0);val q = limit(1);val r = limit(2);val c = limit(3)
      val list = b.toArray.filter { i => i(1) <= p && i(2) <= q && i(3) <= r && i(1)*4 + i(2)*9 + i(3)*4 <= c }
      if(list.length == 0) println("NA")
      else list.foreach(i=>println(i(0)))
    }
  }
}

カロリー計算

食べ物には3大栄養素と呼ばれる「たんぱく質」「脂質」「炭水化物」の３つの栄養素が含まれています。１g（グラム）あたりたんぱく質と炭水化物は 4 kcal（キロカロリー）、脂質は 9 kcal と計算されます。たとえば、下の表によると番号１のケーキにはタンパク質 7 g、脂質 14 g、炭水化物 47 g が含まれています。これをもとに含まれるカロリーを計算すると、4 × 7 + 9 × 14 + 4 × 47 = 342 kcal となります。その他も同様に計算されています。

番号

名前

たんぱく質(g)

脂質(g)

炭水化物(g)

カロリー(kcal)

1

ケーキ

7

14

47

342

2

ポテトチップス

5

35

55

555

3

どら焼き

6

3

59

287

4

プリン

6

5

15

129

分類の対象となるお菓子の個数 n と各お菓子の情報、制限の情報を入力とし、そのお菓子一つだけなら制限を超えることがない（食べてもよい）お菓子の一覧を出力するプログラムを作成してください。

お菓子の情報は、お菓子の番号 s、そのお菓子に含まれるたんぱく質の重量 p、脂質の重量 q、炭水化物の重量 r から構成されています。制限の情報には、含むことができる最大のたんぱく質の重量 P、脂質の重量 Q、炭水化物の重量 R、および摂取することができる最大のカロリー C からなっており、タンパク質、脂質、炭水化物、カロリーのいずれかの一つでも超えると制限違反となり、「食べてはいけないお菓子」と判断されます。

食べてもよいお菓子の一覧は、食べてもよいお菓子の番号を入力順に出力してください。なお、食べてもよいお菓子がなければ”NA”と出力してください。
上の表にある4個のお菓子について、P = 10, Q = 15, R = 50, C = 400 という制限の場合、ケーキとプリンはそれぞれの栄養素及びカロリーが制限値以下なので食べてもよいお菓子に分類されますが、ポテトチップスは炭水化物とカロリー、どら焼きは炭水化物の量が制限値を超えているため食べてはいけないお菓子に分類されます。

入力

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

n
s1 p1 q1 r1
s2 p2 q2 r2
:
sn pn qn rn
P Q R C

1行目にお菓子の数 n (1 ≤ n ≤ 1000)が与えられます。続く n 行に第 i のお菓子の番号 si (1 ≤ si ≤ 1000)、各栄養素の重量を表す整数 pi, qi, ri (0 ≤ pi, qi, ri ≤ 100) が与えられます。

続く行に各栄養素及びカロリーの制限値を表す整数 P, Q, R (0 ≤ P, Q, R ≤ 100), C (0 ≤ C ≤ 1700) が与えられます。

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

出力

データセットごとに、食べてもよいお菓子の番号または ”NA” を出力します。

入力例

4
1 7 14 47
2 5 35 55
3 6 3 59
4 6 5 15
10 15 50 400
2
1 8 10 78
2 4 18 33
10 10 50 300
0

出力例

1
4
NA


object Main extends App {
  import scala.annotation.tailrec
  import scala.io.StdIn._
  loop()
  @tailrec def loop(): Unit = {
    val n = readInt()
    if (n == 0) return
    val pipe = readLine.trim.split(' ').map(_.toInt).sum
    val joint = 0L +: readLine.trim.split(' ').map(_.toLong).sorted(Ordering.Long.reverse)
    for (i ← joint.indices.tail) joint(i) += joint(i - 1)
    println(joint.zipWithIndex.map { case (additional, count) ⇒ (pipe + additional) * (n - count) }.max)
    loop()
  }
}

パイプつなぎ職人の給料

ぼくはパイプつなぎ職人です。パイプをつなぐジョイントとパイプさえもらえれば、どんなパイプだってつないでみせます。ぼくは毎日、親方からパイプとジョイントを渡されて、それをつないで親方に渡します。でも、パイプの数が多すぎるときは、１日でそれを全部つなげることはできません。そんなときでも親方はにっこり笑って、ぼくに給料を渡してくれます。

ところで、あるとき変なことに気がつきました。全部のパイプをつなげられたときより、つなげられなかったときの方が給料が多いことがしょっちゅうあるんです。あんまり変なので、ある日、親方が来たときに、給料の計算方法が書いてあるメモをこっそり見ちゃいました。そしたら、なんと

"給料は「パイプの本数×パイプの長さの総和」で支払う。ただし、ジョイントでつなげて、ひとつながりになったものは、それを１本のパイプとみなす。"

って書いてありました。これで全部つなげた方が給料が安くなることがある理由がわかりました。たとえば下図のように、長さ 1 のパイプ 3 本と長さ 2 のジョイント 2 本を全部つなげると長さ 1+2+1+2+1 = 7 のパイプが 1 本できるので、1 × (7) = 7 です。でも、ジョイントを一つだけ使って長さ 1+2+1 = 4のパイプと長さ 1 のパイプの 2 本にすると2 × (4+1) = 10なので、全部つなげるよりいっぱい給料がもらえます。

親方がなんでこんな方法で給料を決めてるかわからないけど、これでぼくもどうすればもらえる給料を多くできるかわかりました！

それでは、パイプの本数が与えられたとき、もらえる給料の最大の金額を計算するプログラムを作成してください。

入力

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

n
p1 ... pn
j1 ... jn-1

１行目にパイプの本数 n (2 ≤ n ≤ 65000) が与えられる。２行目は１つの空白で区切られた n 個の整数からなる。pi (1 ≤ pi ≤ 1000) はi番目のパイプの長さを示す。３行目は１つの空白で区切られた n-1 個の整数からなる。ji (1 ≤ ji ≤ 1000) は i 番目のジョイントの長さを示す。

i番目のジョイントは、i 番目と i+1 番目のパイプだけをつなげることができる。つなげたパイプの長さは、pi + ji + pi+1 になる。

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

出力

各データセットごとに、得られる給料の最大の金額を1行に出力する。入力として与えられるデータセットでは、出力される値は必ず３２ビット符号無し整数の範囲に収まるものとする。

入力例1

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

出力例

12
48
76


object Main extends App {
    val w = Seq(1, 3, -1, 2, 4, 5, 1, -1, 5, 3, 3, 1).grouped(2).toSeq.lift
    val in = io.Source.stdin.getLines
    for (p <- in if p != "#") {
        val x = p.foldLeft(0)((city, way) => w(city) match {
            case None => -1
            case Some(way0or1) => way0or1(way.asDigit)
        })
        if (x == 5) println("Yes")
        else println("No")
    }
}

アカ・ベコと４０人の盗賊

40 人の盗賊から逃れようとしているアカ・ベコは、A 市の街中で道に迷ってしまった。アカ・ベコは新しいアジトがあるB 市に行きたいのだが地図を盗賊に盗まれてしまった。

盗賊の一人であるコボー氏はアカ・ベコに同情し、気の毒に思っていた。そこで、密かにアカ・ベコに、「あなたがB 市に行くお手伝いをしたいが、仲間にばれない様にしなければならないので、直接道順を教えたいが教えることができない。しかし、あなたの質問には答えられる。」と伝言を送った。

コボー氏は、「○○という道順はどうか。」という質問をアカ・ベコから受け取ると、それがA 市からB市までちょうどたどり付ける道順ならYes、そうでなければNo という答えを伝える。道順のチェックは以下の地図に従って行う。

各都市は一方通行の道でつながっており、それぞれの道には、0 か1 の数字が付いている。アカ・ベコは数字の並びで道順を指定する。例えば、0100 は A 市から X、Z、W 市を経由して B 市にちょうどたどり着く道順である。地図にない道順を選ぶと砂漠に迷い込んでしまい、決して B 市にたどり着くことはない。アカ・ベコは自分がいる都市の名前を知ることはできないため、道順をたどり終えたときにちょうど B 市に到達する必要がある。

コボー氏はアカ・ベコからの質問に答えるために、あなたを密かに雇いプログラムの作成を依頼した。アカ・ベコからの質問を入力すると、それがA 市からB 市にちょうどたどり付ける道順なら Yes、そうでなければ No と出力するプログラムを作成してほしい。

入力

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

p

１行に道順を示す数字 0, 1 の並び p が与えられる。p は100文字を超えない文字列である。

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

出力

データセットごとに、Yes または No を１行に出力する。

入力例

0100
0101
10100
01000
0101011
0011
011111
#

出力例

Yes
No
Yes
No
Yes
No
Yes

４つ目のデータセットでは、B 市を通りすぎてY 市に到達する道順なので No と出力する。

５つ目のデータセットでは、同じ都市を何度か通っているが、B 市にちょうどたどり着く道順なので Yes と出力する。

６つ目のデータセットでは、X 市から砂漠に迷い込んでしまいB 市にはたどり着けないので No と出力する。

最後のデータセットでは、B 市をいったん通り過ぎてから、X 市とZ 市を経由してB 市にちょうどたどり着く道順なので Yes と出力する。


object Main extends App {
  import scala.io.StdIn._
  implicit val timeOrdering = TimeOrdering
  val firstLine = readLine.trim.split(' ').map(_.toInt)
  val secondLine = readLine.trim.split(' ').map(_.toInt)
  val times = (0 until firstLine.head).map(i ⇒ Time(firstLine(i * 2 + 1), firstLine(i * 2 + 2))) ++ (0 until secondLine.head).map(i ⇒ Time(secondLine(i * 2 + 1), secondLine(i * 2 + 2)))
  println(times.distinct.sorted.mkString(" "))

  object TimeOrdering extends Ordering[Time] {
    override def compare(x: Time, y: Time): Int = if (x.hour == y.hour) x.minute.compare(y.minute) else x.hour.compare(y.hour)
  }
}
case class Time(hour: Int, minute: Int) {
  override def toString: String = f"$hour:$minute%02d"
}

路線バスの時刻表

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

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

入力

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

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 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 = {
    recursive(sc, sc.nextLong())
  }

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

  def calc(S: Int, T: Int): Boolean = {
    1 <= S && S <= 12
  }

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

  def recursive(sc: => Scanner, N: Long): Unit = {
    if (N != 0) {
      val r, t = sc.nextLong()

      if (r % 100 == 0) {
        if (t % 30 == 0) {
          println(r / 100 + t / 30 * 5)
        } else {
          println((r / 100 + t / 30 * 5) + " " + (r / 100 + t / 30 * 5 + 5))
        }
      } else {
        if (t % 30 == 0) {
          println((r / 100 + t / 30 * 5) + " " + (r / 100 + t / 30 * 5 + 1))
        } else {
          println((r / 100 + t / 30 * 5) + " " + (r / 100 + t / 30 * 5 + 1) + " " + (r / 100 + t / 30 * 5 + 5) + " " + (r / 100 + t / 30 * 5 + 6))
        }
      }

      recursive(sc, N - 1)
    }
  }

  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())
  }
}

有益氏のオーディオルーム

数学者である有益氏の趣味は音楽鑑賞で、家に念願のオーディオルームを作りました。完成したオーディオルームで、友人を招いてお披露目会を開きたいと考えています。全員にできるだけ良い音で聴いてもらいたいので、部屋の中の何か所かで音を計測し、友人たちの位置での音の質を計算するつもりです。

計測点は、下の図の円弧と線分の交点である 1 番から 35 番までの点から選択します。１つの線分上にある点は、オーディオシステムからの距離が 100ｃｍから 500ｃｍまで 100ｃｍずつ離れて並んでいます。１つの円弧状にある点は、もっとも右のもの（1 番から 5 番までの点）から反時計回りに、0°から 180°
の範囲で 30°度刻みに並んでいます。

このような円弧と線分に囲まれた領域内のどこかに友人が居ることになるので、友人の居る位置によっ
て必要な計測点を選択します。友人の位置は、円弧に沿って反時計回りに測った角度とオーディオシス
テムからの距離で与えられます。必要な計測点は以下のように１点か、２点か、４点が選ばれます。

友人がちょうど計測点の位置にいれば、その１点を選びます。この図の例の場合、選ばれるのは 23 番の点です。

友人が円弧（または線分）の上にちょうど乗っていれば、その円弧（または線分）上にある、友人に最も近い２点を選びます。この図の例の場合、選ばれるのは 18 番と 23 番の点です。

友人が円弧と線分によって囲まれた区画の内側（円弧や線分の上ではない）にいれば、区画を作っている４点を選びます。この図の例の場合、選ばれるのは 17、18、22、23 番の点です。

有益氏を助けるために、必要な計測点の番号を求めるプログラムを作成してください。

入力

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

N
r1 t1
r2 t2
:
rN tN

１行目に友人の数 N (1 ≤ N ≤ 50)が与えられる。続く N 行に、友人の位置が与えられる。友人の位置 ri (100 ≤ ri ≤ 500) はオーディオシステムからの距離を表す整数、ti (0 ≤ ti ≤ 180) は円弧に沿って反時計回りに測った角度を表す整数である。

出力

各友人の位置について、計測点の番号を昇順で１行に出力する。

入出力例

入力例

4
300 120
300 105
250 105
250 90

出力例

23
18 23
17 18 22 23
17 18


import java.util.Scanner

object Main {
  def solve(sc: => Scanner): Unit = {
    println((sc.nextInt, sc.nextInt) match {
      case (h, r) if -r > h => -1
      case (h, r) if r <= h => 1
      case _ => 0
    })
  }

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

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

日の出と日の入り

太陽が現れることを「日の出」、隠れることを「日の入り」と呼びますが、その厳密な時刻は太陽が地平線に対してどのような位置にある時でしょうか。

下の図のように、太陽を円、地平線を直線で表すことにします。このとき、太陽の「日の出」「日の入り」の時刻は、太陽を表す円の上端が地平線を表す直線と一致する瞬間とされています。日の出の時刻を過ぎ、円の上端が直線より上にある時間帯が昼間、円が直線の下へ完全に隠れている時間帯が夜間となります。

ある時刻の地平線から太陽の中心までの高さと、太陽の半径を入力とし、その時刻が「昼間」か、「日の出または日の入り」か、「夜間」かを出力するプログラムを作成せよ。

Input

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

H R

入力は１行からなり、ある時刻の地平線から太陽の中心までの高さを表す整数 H (-1000 ≤ H ≤ 1000) と半径を表す整数 R (1 ≤ R ≤ 1000) が与えられる。ただし、H は太陽の中心が地平線上にあるときを 0 として、それより上にあるときは正、下にあるときは負とする。

Output

昼間のとき「1」、日の出または日の入りのとき「0」、夜間のとき「-1」を１行に出力する。

Sample Input 1

-3 3

Sample Output 1

0

Sample Input 2

3 3

Sample Output 2

1

Sample Input 3

-4 3

Sample Output 3

-1


object Main extends App {

  import scala.io.StdIn._
  import scala.math._

  val n = readLine.trim.toInt
  val points = Array.tabulate(n){_ ⇒
    readLine.trim.split(' ').map(_.toInt - 1).sorted.foldLeft(0){case (a, b) ⇒ a * n + b}
  }.groupBy(it ⇒ it)
  println(
    points.toArray.map{case (_, a) ⇒ a.length - 1}.sum
  )
  implicit class Extenion[T](val value :T){
    def also(func: T ⇒ Unit): T = {
      func(value)
      value
    }
    def let[R](func: T ⇒ R): R = func(value)
  }
}
/*

 */

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

形状データ処理

コンピュータグラフィクスでは、三次元の形状を表現する方法として、ポリゴンモデルが使われます。ポリゴンモデルとは、頂点座標と、それらの頂点のつなぎ方を与えて面を作るモデルです。

一般のポリゴンモデルでは、任意の多角形を扱えますが、今回は三角形からなるポリゴンモデルを考えることにします。任意のポリゴンモデルは三角形を表す面情報の集まりとして表すことができます。

一つの面情報は、３つの頂点を並べて表します。ただし、並び方が異なるだけで同じ３点からなる場合は、同じ面情報を表すことにします。例えば、下図の四面体で、頂点１,２,３を繋いでできる面は、頂点２,３,１や、頂点３,２,１などのように表すこともできます。このように、同じ面情報が複数あると無駄になるので、１つにまとめてしまった方が良いでしょう。

面情報が与えられたとき、重複した面を無くすために消さなければならない面情報の個数を求めるプログラムを作成せよ。

Input

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

N
p11 p12 p13
p21 p22 p23
:
pN1 pN2 pN3

１行目に、ポリゴンモデルの面情報の数 N (1 ≤ N ≤ 1000) が与えられる。続く N 行に、i 番目の面を作るために使う頂点の番号 pij (1 ≤ pij ≤ 1000) が与えられる。ただし、一つの面について、同じ頂点を２度以上使うことはない（pi1 ≠ pi2 かつ pi2 ≠ pi3 かつ pi1 ≠ pi3 である）。

Output

重複した面を無くすために消さなければならない面情報の個数を１行に出力する。

Sample Input 1

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

Sample Output 1

0

Sample Input 2

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

Sample Output 2

2

入出力例２では、１つ目と５つ目と６つ目の面は頂点1, 3, 2を使って三角形を作っていて、点の順番が異なるだけなので重複している。つまり、重複した面のうち２つの面を消せば重複した面は無くなる。


object Main extends App {

  import scala.io.StdIn._
  import scala.math._

  val n = readLine.trim.toInt
  val p = readLine.trim.split(' ').map(_.toInt)
  var min = Int.MaxValue
  for (r ← 0 to p.head){
    val arr = p.clone()
    var sum = r
    arr(0) -= r
    for (i ← arr.indices){
      if (arr(i) > 0){
        sum += arr(i)
        if (i + 1 < arr.length) {
          sum += arr(i)
          arr(i + 1) -= arr(i)
        }
      }
    }
    if (sum < min) min = sum
  }
  println(
    min
  )
  implicit class Extenion[T](val value :T){
    def also(func: T ⇒ Unit): T = {
      func(value)
      value
    }
    def let[R](func: T ⇒ R): R = func(value)
  }
}
/*

 */

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

パンケーキ

あなたが勤めているパンケーキ屋では、細長い鉄板にパンケーキの生地を横１列に並べて焼きます。パンケーキはへらで何回か裏返せば完成します。何回以上裏返せば完成するかはパンケーキごとに異なります。

へらは大きいので、隣り合ったパンケーキは２枚同時に裏返されてしまいます。このとき、これら２枚の位置は入れ替わりません。ただし、両端だけは、隣のパンケーキといっしょに裏返すだけでなく、１枚だけ裏返すこともできます。すべてのパンケーキを必要な回数以上裏返したら、全部いっぺんに鉄板からおろして完成です。

パンケーキを必要な回数より多く裏返すと固くなってしまうので、あまり多く裏返したくありません。そこであなたは、すべて完成するまでに、各パンケーキが裏返る回数の総和が最小になるような方法を見つけようと考えました。

鉄板の上のパンケーキの枚数と、完成するまでに何回以上裏返さなければならないかがパンケーキごとに与えられているとき、すべて完成するまでに各パンケーキが裏返る回数（へらを操作する回数ではない）の総和の最小値を計算するプログラムを作成せよ。

Input

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

N
p1 p2 ... pN

１行目にパンケーキの枚数 N (3 ≤ N ≤ 5000)が与えられる。２行目に各パンケーキが完成するまでに必要な裏返す回数 pi (0 ≤ pi ≤ 3)が与えられる。

Output

すべて完成するまでに各パンケーキが裏返る回数の総和の最小値を１行に出力する。

Sample Input 1

3
1 2 1

Sample Output 1

4

へらを１回操作して左端と真ん中のパンケーキを裏返すと、２個のパンケーキが１回ずつ裏返るので、この操作で裏返る回数は２回。さらに、へらを１回操作して真ん中と右端のパンケーキを裏返すと、２個のパンケーキが１回ずつ裏返るので、この操作で裏返る回数は２回。以上の総和４回が答えになる。

Sample Input 2

3
0 3 0

Sample Output 2

6

へらを１回操作して左端と真ん中のパンケーキを裏返すと、この操作で裏返る回数は２回。これを３回繰り返したときの、総和の６回が答えになる（真ん中のパンケーキは、両隣のどちらかのパンケーキと一緒に裏返すことしかできないことに注意）。


import scala.util.Random

object Main extends App {

  import scala.io.StdIn._
  import scala.math._

  val rand = new Random()
  val Array(n, c) = readLine.trim.split(' ').map(_.toInt)
  val team = Array.tabulate(n){id ⇒ Team(id + 1, 0L)}
  var treap = team.foldLeft(Leaf:Treap[Team]){case (treap, team) ⇒ treap.insert(team, rand.nextDouble())}
  for (_ ← 0 until c){
    val command = readLine.trim.split(' ').map(_.toInt)
    command match {
      case Array(0, t, p) ⇒
        val current = team(t - 1)
        treap = treap.erase(current)
        team(t - 1) = Team(t, current.score + p)
        treap = treap.insert(team(t - 1), rand.nextDouble())
      case Array(1, m) ⇒
        println(
          treap.findNth(m).get.let{t ⇒ s"${t.id} ${t.score}"}
        )
      case _ ⇒ ???
    }
  }
  case class Team(id: Int, score:Long) extends Ordered[Team] {
    override def compare(that: Team): Int = if (score == that.score) id.compare(that.id) else that.score.compare(score)
  }
  sealed trait Treap[+T] {
    def size: Int
    def findNth(rank: Int): Option[T]
    def insert[TT >: T <: Ordered[TT]](value: TT, priority: Double): Treap[TT]
    def erase[TT >: T <: Ordered[TT]](value: TT): Treap[T]
  }
  case class Node[T <: Ordered[T]](value: T, priority: Double, left: Treap[T], right: Treap[T]) extends Treap[T] {
    override val size: Int = left.size + right.size + 1

    override def findNth(rank: Int): Option[T] = {
      if (left.size >= rank) left.findNth(rank)
      else if (left.size + 1 == rank) Some(value)
      else right.findNth(rank - left.size - 1)
    }

    override def insert[TT >: T <: Ordered[TT]](value: TT, priority: Double): Treap[TT] = {
       value.compare(this.value) match {
        case 0 ⇒ throw new Error(s"$value is already exists")
        case 1 ⇒ right.insert(value, priority) match {
          case Node(v, p, l, r) if p > this.priority ⇒ Node(v, p, Node(this.value, this.priority, left, l), r)
          case r ⇒ Node(this.value, this.priority, left, r)
        }
        case _ ⇒ left.insert(value, priority) match {
          case Node(v, p, l, r) if p > this.priority ⇒ Node(v, p, l, Node(this.value, this.priority, r, right))
          case l ⇒ Node(this.value, this.priority, l, right)
        }
      }
    }

    override def erase[TT >: T <: Ordered[TT]](value: TT): Treap[T] = {
      value.compare(this.value) match {
        case 0 ⇒ (left, right) match {
          case (Node(lv, lp, ll, lr), r@Node(_, rp, _, _)) if lp > rp ⇒ Node(lv, lp, ll, Node(this.value, this.priority, lr, r).erase(value))
          case (l@Node(_, lp, _, _), Node(rv, rp, rl, rr)) if lp < rp ⇒ Node(rv, rp, Node(this.value, this.priority, l, rl).erase(value), rr)
          case (Leaf, r) ⇒ r
          case (l, Leaf) ⇒ l
        }
        case 1 ⇒ Node(this.value, this.priority, left, right.erase(value))
        case _ ⇒ Node(this.value, this.priority, left.erase(value), right)
      }
    }

    override def toString: String = (if (left.isInstanceOf[Node[_]]) left.toString + "," else "") + value.toString + (if (right.isInstanceOf[Node[_]]) "," + right.toString else "")
  }
  case object Leaf extends Treap[Nothing] {
    override val size: Int = 0
    override def findNth(rank: Int): Option[Nothing] = None
    override def insert[TT >: Nothing <: Ordered[TT]](value: TT, priority: Double): Treap[TT] = Node(value, priority, Leaf, Leaf)
    override def erase[TT >: Nothing <: Ordered[TT]](value: TT): Treap[Nothing] = Leaf
  }

  implicit class Extenion[T](val value :T){
    def also(func: T ⇒ Unit): T = {
      func(value)
      value
    }
    def let[R](func: T ⇒ R): R = func(value)
  }
}
/*

 */

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

プログラミングコンテスト II

白虎大学では毎年プログラミングコンテストを開催しています。コンテストは全てのチームの得点が 0の状態から開始し、解答状況に応じて得点が加算されていきます。このコンテストでは、得点の高い順に順位付けが行われます。チームの総数を N としたとき、チームには 1 から N の番号がそれぞれ割り当てられています。得点が同じ場合は番号がより小さい方が上位になります。

白虎大学では、コンテストを盛り上げるために観戦用のランキングシステムを開発しています。開発チームの一員であるあなたは、このシステムの一部であるプログラムの作成を任されています。

与えられた命令に従って、得点の更新と、指定された順位のチームの番号と得点を報告するプログラムを作成せよ。

Input

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

N C
command1
command2
:
commandC

１行目にチーム数 N (2 ≤ N ≤ 100000) と命令の数 C (1 ≤ C ≤ 100000)が与えられる。続く C 行に、１行ずつ命令が与えられる。各命令は以下の形式で与えられる。

0 t p

または

1 m

最初の数字が0のとき更新命令、1のとき報告命令を表す。更新命令では指定された番号 t (1 ≤ t ≤ N) のチームに、整数で与えられる得点 p (1 ≤ p ≤ 109) を加算する。報告命令では指定された順位 m (1 ≤ m ≤ N) のチームの番号と得点を報告する。ただし、報告命令は少なくとも１回現れるものとする。

Output

各報告命令に対して、指定された順位のチームの番号と得点を空白区切りで１行に出力する。

Sample Input 1

3 11
0 2 5
0 1 5
0 3 4
1 1
1 2
1 3
0 3 2
1 1
0 2 1
1 2
1 3

Sample Output 1

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

Sample Input 2

5 2
1 1
1 2

Sample Output 2

1 0
2 0