#encoding:utf-8 No.0001
list_of_height = []

while gets
 list_of_height.push $_.to_i
end

puts list_of_height.sort.reverse[0..2]

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.


a = Array.new
10.times do |i|
	a.push(gets.to_i)
end

a.sort!

3.times do |i|
	p a[a.size - i - 1]
end


x=[]
n=10
for i in 0..(n-1)
  print "山の高さ"+(i+1).to_s+"(整数)>"
  x[i]=gets.chomp.to_i
end
max=0
num=0
for i in 0..(n-1)
  if x[i]>=0 && x[i]<=10000
    max=x[i]
    num=i
    break
  end
end
for i in num..(n-1)
  if x[i] > max && x[i]>=0 && x[i]<=10000
    max = x[i]
  end
end
puts "最も高い山の高さ="+ max.to_s
max2=0
for i in num..(n-1)
  if x[i]<max && x[i]>max2 && x[i]>=0 && x[i]<=10000
    max2 = x[i]
  end
end
puts "2番目に高い山の高さ=" + max2.to_s
max3=0
for i in num..(n-1)
  if x[i]<max2 && x[i]>max3 && x[i]>=0 && x[i]<=10000
    max3=x[i]
  end
end
puts "3番目に高い山の高さ=" + max3.to_s


i = 0
array = []

while i < 10
 word = gets.chomp
 array.push word.to_i
 i = i+1
end

array = array.sort
array = array.reverse

puts array[0]
puts array[1]
puts array[2]


data_set = []
while numbers = gets
  data_set << (numbers[0].to_i + numbers[1].to_i).to_s.length
end
puts data_set

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


# coding: utf-8
line = gets
while input = gets
  ans = []
  input = input.split(" ").map!(&:to_i).sort
  ans.push(input[0] % 3,input[1] % 4,input[2] % 5)
  if ans.all? {|n| n == 0} ;puts "YES"
  else ;puts "NO"
  end
end

Is it a Right Triangle?

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

Input

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

Constraints

1 ≤ length of the side ≤ 1,000

N ≤ 1,000

Output

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

Sample Input

3
4 3 5
4 3 6
8 8 8

Output for the Sample Input

YES
NO
NO


input_a = gets.to_s
input_b = gets.to_s

formula_a = input_a.split(' ').map(&:to_i)
formula_b = input_b.split(' ').map(&:to_i)

fa_x = ((formula_a[2] * formula_a[4]) - (formula_a[1] * formula_a[5])) / ((formula_a[0] * formula_a[4]) - (formula_a[1] * formula_a[3]) + 0.000)
fa_y = ((formula_a[0] * formula_a[5]) - (formula_a[2] * formula_a[3])) / ((formula_a[0] * formula_a[4]) - (formula_a[1] * formula_a[3]) + 0.000)
fb_x = ((formula_b[2] * formula_b[4]) - (formula_b[1] * formula_b[5])) / ((formula_b[0] * formula_b[4]) - (formula_b[1] * formula_b[3]) + 0.000)
fb_y = ((formula_b[0] * formula_b[5]) - (formula_b[2] * formula_b[3])) / ((formula_b[0] * formula_b[4]) - (formula_b[1] * formula_b[3]) + 0.000)

puts format('%.3f', fa_x) + " " + format('%.3f', fa_y)
puts format('%.3f', fb_x) + " " + format('%.3f', fb_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


while line = gets
  a, b = line.chomp.split.map(&:to_i)
  gcd = a.gcd(b)
  lcm = a * b / gcd
  puts "#{gcd} #{lcm}"
end


def gcd(a, b)
  a, b = b, a if a > b
  until a == 0
    a, b = b%a, a
  end
  return b
end

def lcm(a, b)
  a*b/gcd(a, b)
end

while gets do
  a, b = $_.chomp.split(' ').map(&:to_i)
  puts "#{gcd(a, b)} #{lcm(a, b)}"
end

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


Reverse Sequence

Write a program which reverses a given string str.

Input

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

Output

Print the reversed str in a line.

Sample Input

w32nimda

Output for the Sample Input

admin23w


debt = 100000
interest_rate = 0.05

week = gets.to_i
week.times do
  debt += ((debt * interest_rate) / 1000).ceil * 1000
end

puts debt

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


n = gets.to_i
debt = 10**5
n.times {
	debt*=1.05
	debt = (debt/ 1000.0).ceil * 1000.0}
puts debt


2.times do  n = gets.to_i
sum = 0
(0..9).each do |a|
  (0..9).each do |b|
    (0..9).each do |c|
      (0..9).each do |d|
        if  a + b + c + d == n then
        sum +=1
        end
      end
    end
  end
end
puts sum
end

Sum of 4 Integers

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

a + b + c + d = n

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

Input

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

Output

Print the number of combination in a line.

Sample Input

35
1

Output for the Sample Input

4
4


#素数でない数
#   1
#   ２以外の２の倍数
#   二乗してもnumberを超えない奇数で割り切れない数
#素数でない数以外は全て素数
def checkPrime(number)
  if number == 1 or number == 2
    return true
  elsif number % 2 == 0
    return false
  else
    i = 3
    while (i * i < number + 1)
      if number % i == 0
        return false
      end
      i += 2
    end
    return true;
  end
end

#入力バッファ
n = 0
input = ""
counter = 0
#メインルーチン
while input = gets
  n = input.to_i
  count = 0
  for i in 2..n
    if checkPrime(i)
      count += 1
    end
  end
  p count
  if (counter += 1) == 30
    break;
  end
end

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


while num = gets()
  if (num.nil? or num == "\n" or num == "\n\r") then break end
  num = num.to_i
  prime = 0

  (2..num).each do |n|
    is_prime = true
    (2...n).each do |a|
      if n % a == 0 then
        is_prime = false
      end
    end
    prime += 1 if is_prime
  end
  puts prime
end


def in_same_side?(ary_1, ary_2, ary_3, ary_p)
  a, b = ary_1
  c, d = ary_2
  i, k = ary_3
  p, q = ary_p
  alpha = (d - b)/(c - a)
  #ary_1, ary_2を通る直線 y = alpha * x + b - alpha * a
  if a == c
    laterality_ary_3 = i - a
    laterality_ary_p = p - a
  elsif b == d
    laterality_ary_3 = k - b
    laterality_ary_p = q - b
  else
    laterality_ary_3 = k - (alpha*i + b - alpha*a)
    laterality_ary_p = q - (alpha*p + b - alpha*a)
  end

  if laterality_ary_3 > 0 == laterality_ary_p > 0
    return true
  else
    return false
  end
end

while line = gets
  p = line.chomp.split.map(&:to_f).each_slice(2).to_a

  if in_same_side?(p[0], p[1], p[2], p[3]) && \
        in_same_side?(p[0], p[2], p[1], p[3]) && \
        in_same_side?(p[1], p[2], p[0], p[3])
    puts :YES
  else
    puts :NO
  end
end

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


class CaesarCipher
  def initialize(str)
    @str_arr = str.split(" ")
    @answer = []
    @alphabet = ("a".."z").to_a
    @first_words = ["the", "this", "that"]

  end

  def decipher
    first_word = @str_arr.first.split("").map{|c| c.ord - "a".ord}
    temp = []
    step_number = 0
    1.step(25, 1) do |i|
      temp = first_word.map{|c, s = i| @alphabet[c - i]}

      if @first_words.include?(temp.join(""))
        step_number = i
        break
      end
    end
    @str_arr.length.times do |i|
      @answer.push @str_arr[i].split("").map {|c, s = step_number|
        if c != "."
          @alphabet[c.ord - "a".ord - s]
        else
          c
        end
      }.join("")
    end
    @answer.join(" ")
  end
end

line = gets.chomp
caesar_cipher = CaesarCipher.new(line)
puts caesar_cipher.decipher

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.


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


str = STDIN.gets
nums = str.split(" ")
nums = nums.sort {|a, b| b <=> a }

puts nums.join(" ")


n = gets.to_i
sum = 1
1.upto(n) {|e| sum *= e}

puts sum

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


Capitalize

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

Input

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

Output

Print the converted text.

Sample Input

this is a pen.

Output for the Sample Input

THIS IS A PEN.


puts "Fisic start"

while line = gets
  v = line.to_i

  t = v / 9.8
  y = 4.9 * t**2
  n = ( y + 5 ) / 5
  n = n.ceil
  puts n
  break
end

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

Physical Experiments

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

$ v = 9.8 t $

$ y = 4.9 t^2 $

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

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

Input

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

Output

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

Sample Input

25.4
25.4

Output for the Sample Input

8
8


while (line = gets)
  v = line.chop.to_f

  t = v / 9.8
  y = 4.8 * t * t

  n = (y / 5).ceil + 1

  puts n
end


# coding : utf-8
#
class HitAndBlow
  def game
    loop do
      line_a = gets
      break if line_a == nil
      line_b = gets
      break if line_b == nil

      array_a = line_a.chomp.split.map {|s| s.to_i}
      array_b = line_b.chomp.split.map {|s| s.to_i}

      cnt_hit = 0
      cnt_blow = 0
      4.times do |i|
        if array_a[i] == array_b[i] then
          cnt_hit += 1
        elsif array_a.include?(array_b[i]) then
          cnt_blow += 1
        end
      end
      puts "#{cnt_hit} #{cnt_blow}"
    end
  end

end

HitAndBlow.new.game

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


while line = gets
a = line.split.map(&:to_i)
b = gets.split.map(&:to_i)

count1 = 0
count2 = 0

for i in (0..3)
  for j in (0..3)
    if a[i] == b[j]
      if i == j
        count1 += 1
      else
        count2 += 1
      end
    end
  end
end
puts count1.to_s+" "+count2.to_s
end


p = Array.new(10) { (0..9).map { 0 } }
ds = [0, 1, 2, 4]

while (line = gets)
  x, y, size = line.chop.split(",").map{|s| s.to_i}

  d = ds[size]
  for i in (0..9)
    for j in (0..9)
      if (x - i) ** 2 + (y - j) ** 2 <= d
        p[i][j] += 1
      end
    end
  end
end

pf = p.flatten

count = pf.select{|k| k == 0}.length
max = pf.max

puts count, max

Dropping Ink

As shown in the following figure, there is a paper consisting of a grid structure where each cell is indicated by (x, y) coordinate system.

We are going to put drops of ink on the paper. A drop comes in three different sizes: Large, Medium, and Small. From the point of fall, the ink sinks into surrounding cells as shown in the figure depending on its size. In the figure, a star denotes the point of fall and a circle denotes the surrounding cells.

Originally, the paper is white that means for each cell the value of density is 0. The value of density is increased by 1 when the ink sinks into the corresponding cells.

For example, if we put a drop of Small ink at (1, 2) and a drop of Medium ink at (3, 2), the ink will sink as shown in the following figure (left side):

In the figure, density values of empty cells are 0. The ink sinking into out of the paper should be ignored as shown in the figure (top side). We can put several drops of ink at the same point.

Your task is to write a program which reads a sequence of points of fall (x, y) with its size (Small = 1, Medium = 2, Large = 3), and prints the number of cells whose density value is 0. The program must also print the maximum value of density.

You may assume that the paper always consists of 10 × 10, and 0 ≤ x < 10, 0 ≤ y < 10.

Input

x1,y1,s1
x2,y2,s2
:
:

(xi, yi) represents the position of the i-th drop and si denotes its size. The number of drops is less than or equal to 50.

Output

Print the number of cells whose density value is 0 in first line.

Print the maximum value of density in the second line.

Sample Input

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

Output for the Sample Input

77
5


a = []

loop do
	s = gets
	if !s then break; end
	a.push(s.to_i)
end

ary = []

for i in a.min..a.max do
	if !ary.max or a.count(i) >= ary.max()
		if !ary.max or a.count(i) > ary.max() then ary = []; end
		ary.push(i)
	end
end

ary.each do |v|
	puts v
end

Mode Value

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

Input

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

Output

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

Sample Input

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

Output for the Sample Input

3
5

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


def mode_value(arr)
  n, mv = 0, []

  100.times do |i|
    if n < arr[i]
      n, mv = arr[i], [i + 1]
    elsif n == arr[i]
      mv << i + 1
    end
  end

  return mv
end

arr = Array.new(100, 0)

arr[$_.to_i - 1] += 1 while gets

puts mode_value(arr)


def weight
  master = Array.new(10) { |i| 2**i }
  while gets
    wei = $_.to_i
    spindles = master.select { |i| i < wei }
    result = []
    while true
      break if wei <= 0
      wei -= 1
      minus = spindles.max
      # if minus > wei
      #   next
      # end
      # w = w - minus
      # spindles.delete(minus)
      # result << minus
    end
    puts result.sort.join(' ')
  end
end

weight

Weight

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

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

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

Input

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

Output

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

Sample Input

5
7
127

Output for the Sample Input

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

Hint

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


hishi = 0
tyou = 0
while input = gets do
  a,b,c = input.chop.split(",").map{|n| n.to_i}
  if a == b then
    hishi += 1
  elsif a**2 + b**2 == c**2 then
    tyou += 1
  end
end
puts tyou,hishi

プラスティック板

機械に辺・対角線の長さのデータを入力し、プラスティック板の型抜きをしている工場があります。この工場では、サイズは様々ですが、平行四辺形の型のみを切り出しています。あなたは、切り出される平行四辺形のうち、長方形とひし形の製造個数を数えるように上司から命じられました。

「機械に入力するデータ」を読み込んで、長方形とひし形の製造個数を出力するプログラムを作成してください。

Input

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

a1,b1,c1
a2,b2,c2
:

機械に入力するデータが複数行に与えられます。i 行目に i 番目の平行四辺形の隣り合う２辺の長さを表す整数 ai, bi と対角線の長さを表す整数 ci がカンマ区切りで与えられます (1 ≤ ai, bi, ci ≤ 1000, ai + bi > ci)。データの数は 100 件を超えません。

Output

１行目に長方形の製造個数、２行目ひし形の製造個数を出力します。

Sample Input

3,4,5
5,5,8
4,4,4
5,4,3

Output for the Sample Input

1
2


gets
(n,*a=$_.split.map &:to_i
puts a.reject!{|i|i>n ?n=i :!0}==a.sort ? :YES: :NO)while gets

玉

図のように二股に分かれている容器があります。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


op = ["+","-","*"]
p = op.product(op,op)

def convp(p, mode)
  st = []
  while p.size > 0
    x = p.shift
    if mode == 0
      case x
      when "+"
        st.push(st.pop+st.pop)
      when "-"
        st.push(-st.pop+st.pop)
      when "*"
        st.push(st.pop*st.pop)
      else #numeric
        st << x
      end
    else
      if x.to_s =~ /[1-9]/
        st.push(x.to_s)
      else
        a,b=st.pop,st.pop
        (x == "*" and b.size != 1) ? st.push("("+b+")"+" "+x+" "+a) : st.push("("+b+" "+x+" "+a+")")
      end
    end
  end
  return st
end

loop do
  e,f,g,h = gets.split.map(&:to_i)
  # puts "#{e},#{f},#{g},#{h}"
  break if e+f+g+h==0
  catch(:exit) do
    [e,f,g,h].permutation(4) do |a,b,c,d|
      p.each do |l|
        ln = Array.new(5){[a,b]}
        5.times do |idx|
          case idx
          when 0
            [ln[0],ln[1],ln[2]].each{|x| x << c}
            [ln[3],ln[4]].each{|x| x << l[0]}
          when 1
            ln[0] << d
            [ln[1],ln[2]].each{|x| x << l[0]}
            [ln[3],ln[4]].each{|x| x << c}
          when 2
            ln[0] << l[0]
            [ln[1],ln[4]].each{|x| x << d}
            [ln[2],ln[3]].each{|x| x << l[1]}
          when 3
            [ln[0],ln[1],ln[4]].each{|x| x << l[1]}
            [ln[2],ln[3]].each{|x| x << d}
          when 4
            ln.each{|x| x << l[2]}
          end
        end
        5.times do |i|
          lnb = Marshal.load(Marshal.dump(ln))
          if convp(ln[i], 0)[0] == 10
            puts convp(lnb[i],1)
            throw(:exit)
          end
        end
      end
    end
    p 0
  end
end

式

与えられた 4 つの 1 から 9 の整数を使って、答えが 10 になる式をつくります。
4 つの整数 a, b, c, d を入力したとき、下記の条件に従い、答えが 10 になる式を出力するプログラムを作成してください。また、答えが複数ある時は、最初に見つかった答えだけを出力するものとします。答えがない時は、0 と出力してください。

演算子として、加算 (+)、減算 (-)、乗算 (*) だけを使います。除算 (/) は使いません。使用できる演算子は３個です。

数を4つとも使わなければいけません。

4つの数の順番は自由に入れ換えてかまいません。

カッコを使ってもかまいません。使用できるカッコは３組（６個）以下です。

Input

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

a b c d

入力は４つの 0 で終了します。データセットの数は 40 を超えません。

Output

各データセットについて、与えられた 4 つの整数と上記の演算記号およびカッコを組み合わせて値が 10 となる式または 0 を１行に出力してください。式の文字列が 1024 文字を超えてはいけません。

Sample Input

8 7 9 9
4 4 4 4
5 5 7 5
0 0 0 0

Output for the Sample Input

((9 * (9 - 7)) - 8)
0
((7 * 5) - (5 * 5))


def check(table)
  result = 0
  if table.sum <= 2
    result = 1 if table.find {|x| x == 2}
  else
    (1..7).each do |i|
      tmp = table.dup
      if tmp[i].nonzero? and tmp[i + 1].nonzero? and tmp[i + 2].nonzero?
        3.times {|x| tmp[i + x] -= 1}
        result += check(tmp)
        return 1 if result.nonzero?
      end
      (1..9).each do |j|
        tmp1 = table.dup
        if tmp1[j] >= 3
          tmp1[j] -= 3
          result += check(tmp1)
          return 1 if result.nonzero?
        end
      end
    end
  end
  result
end

$<.readlines.map(&:chomp).map {|n| n.chars.map(&:to_i)}.each do |data|
  table = Array.new(10, 0)
  data.each {|i| table[i] += 1}
  result = (1..9).map do |i|
    added = table.dup
    added[i] += 1
    next if added[i] > 4
    check(added).nonzero? ? i : nil
  end.compact
  puts result.empty? ? 0 : result.join(" ")
end

パズル

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


is_prime = Array.new(50001, true)
is_prime[0] = is_prime[1] = false
(2..223).each{|p|
  if is_prime[p]
    (p*2).step(50000,p){|i|
      is_prime[i] = false
    }
  end
}

f = ->n{
  return (is_prime[n-2] ? 1 : 0) if n.odd?
  (2..(n/2)).count{|i| is_prime[i] and is_prime[n-i]}
}

loop{
  n = gets.to_i
  break if n==0
  p f[n]
}

ゴールドバッハの予想

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


while s=gets
  x=s.chomp.to_i
  puts (x*(x+1)/2+1)
end

領域の数

無限に広い平面の上に、無限に長い直線を数本引くと、この平面はいくつかの領域に分割されます。たとえば、直線を１本引くと、平面は２つの領域に分割されます。同じ数の直線を引いても、引き方によって得られる領域の数は異なります。たとえば、2 本の直線を平行に引けば得られる領域は 3 つになり、互いに垂直に引けば得られる領域は 4 つになります。

n 本の直線を引くことで得られる最大の領域の数を出力するプログラムを作成してください。

Input

複数のデータセットが与えられます。各データセットに n (1 ≤ n ≤ 10,000) が１行に与えられます。入力の最後まで処理して下さい。

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

Output

各データセットに対して、最大の分割数を１行に出力して下さい。

Sample Input

1
3

Output for the Sample Input

2
7


readlines.each do |l|
  xa1,ya1,xa2,ya2,xb1,yb1,xb2,yb2 = l.split.map(&:to_f)
  puts (xb1<=xa1 && xa1<=xb2 || xa1<=xb1 && xb1<=xa2) &&
       (yb1<=ya2 && ya2<=yb2 || ya1<=yb2 && yb2<=ya2) ? "YES" : "NO"
end

長方形の重なり

底辺が x 軸に対して平行な 2 つの長方形があります。長方形 A の左下の座標 (xa1, ya1) と右上の座標 (xa2, ya2)、長方形 B の左下の座標 (xb1, yb1) と右上の座標 (xb2, yb2) を読み込んで、長方形 A と長方形 B が一部でも重なっていれば YES を、まったく重なっていなければ NO を出力するプログラムを作成してください。ただし、長方形 A と長方形 B は同じものではないとします。また、接しているものも重なっているとみなします。

Input

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

xa1 ya1 xa2 ya2 xb1 yb1 xb2 yb2

入力される値はそれぞれ -2,000 以上 2,000 以下であり、各値は小数点以下最大 5 桁までの数字を含む実数で与えられます。

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

Output

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

Sample Input

0.0 0.0 5.0 5.0 1.0 1.0 4.0 4.0
0.0 0.0 4.0 5.0 1.0 1.0 5.0 5.0
0.0 0.0 4.0 4.0 -3.0 -5.0 2.0 -1.0

Output for the Sample Input

YES
YES
NO


class Node
  attr_reader :id
  @@i = 0
  def self.clear
    @@i = 0
  end
  def initialize
    @u = nil
    @id = @@i
    @@i += 1
  end

  def ==(other)
    return find().id == other.find.id
  end
  def find()
    if @u
      return @u = @u.find()
    else
      return self
    end
  end

  def join(other)
    if @u
      @u.find.join(other)
    else
      @u = (other.find == (self)) ? nil : other.find
    end
  end
end

def main
  while (n = gets.to_i) != 0
    m = gets.to_i
    nodes = Array.new(n){Node.new}
    path = Array.new(m){gets.chomp.split(",").map(&:to_i)}.sort_by{|(a, b, c)|c}
    puts path.map{|r|
      unless nodes[r[0]] == nodes[r[1]]
        nodes[r[0]].join(nodes[r[1]])
        r[2] - 100
      else
        0
      end}.reduce(0){|a, i|a + i / 100}
    Node.clear
  end
end
main

灯篭

会津若松市は「歴史の町」として知られています。今から約 400 年前、蒲生氏郷により城下町の骨格が作られましたが、その後、徳川三代将軍家光公の異母弟「保科正之」公を藩祖とする会津藩 23 万石の中心都市として発展しました。今でも市内のいたるところに史跡や昔日の面影が残っているため、毎年、全国から多くの観光客が訪れています。

今年は、ＮＨＫ大河ドラマで「新選組！」が放送されているため、新選組ゆかりの地(*1)として、大幅に観光客が増加しています。そこで市では、市内に点在する史跡を結ぶ通り沿いに 100 m 間隔で灯篭を設置して飾りたてることにしました。灯篭を飾ってある通りを辿れば市内の全ての史跡に到達できるように設置することが条件ですが、一筆書きでたどれる必要はありません。しかし、予算が限られているので設置する灯篭の数を最小限にする必要があります。

史跡と史跡を結ぶ通りのデータを読み込んで、必要最小限の灯篭の数を出力するプログラムを作成して下さい。ただし、史跡と史跡の間の距離は 200 m 以上で、100 の倍数で与えられます。おのおのの史跡から一番近い灯篭までの距離は 100 m で、市内の史跡は 100 箇所以内です。史跡自身には灯篭を設置する必要はありません。

(*1) 新選組は会津藩御預という形で発足、白虎隊の悲劇で知られる会津戊辰戦争に参戦、市内天寧寺に土方歳三が近藤勇の墓を建立

Input

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

n
m
a1,b1,d1
a2,b2,d2
:
am,bm,dm

各データセットの最初の 1 行には史跡の箇所数 n が与えられます。続いて史跡と史跡を結ぶ通りの数 m が与えられます。続く m 行に カンマで区切られてた3 つの数数 ai, bi, di が与えられます。ai, bi は史跡の番号です。史跡の番号は 0 番から n - 1 番まで振られています。ai bi はそれらを結ぶ通りがあることを示し、di は ai bi 間の道路の距離を表します。

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

Output

各データセットに対して、必要最小限の灯篭の数を１行に出力して下さい。

Sample Input

4
4
0,1,1500
0,2,2000
1,2,600
1,3,500
0

Output for the Sample Input

23


loop do
    record_time=2*3600#????????§???????§???°
    time=gets.chomp.split(nil).map(&:to_i)
    break if time.all?{|x|x==-1}
    t=time[2]
    t+=time[1]*60
    t+=time[0]*3600
    #?¨??????????
    rest_of_time=record_time-t
    h=rest_of_time/3600#hour
    m=(rest_of_time%3600)/60#minute
    s=rest_of_time%60#second
    printf("%02d:%02d:%02d \n",h,m,s)
    #3???????????¢??????
    rest_of_time=(record_time-t)*3
    h=rest_of_time/3600#hour
    m=(rest_of_time%3600)/60#minute
    s=rest_of_time%60#second
    printf("%02d:%02d:%02d \n",h,m,s)
end

ビデオテープ

標準録画で 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


while (line = gets)
    str = line.chomp
    status = 0
    uns = ""
    num = 0
    str.each_char do |ch|
        case status
        when 0 then
            if ch == "@"
                status = 1
            else
                uns += ch
            end
        when 1 then
            num = ch.to_i
            status = 2
        when 2 then
            num.times {uns += ch}
            status = 0
        end
    end

    puts uns
end

ランレングス

文字列が連続した場合、ある規則で文字を置き換え文字列を短くすることができます。たとえば、AAAA という文字列の場合、@4A と表現すれば 1 文字分圧縮されます。この規則で圧縮された文字列を入力してもとの文字列に復元するプログラムを作成してください。ただし、復元した文字列に＠文字は出現しないものとします。

また、原文の文字列は英大文字、英小文字、数字、記号であり 100 文字以内、連続する文字は 9 文字以内です。

入力

複数の文字列が与えられます。１行に１つの文字列が与えられます。文字列の数は 50 を超えません。

出力

文字列ごとに、各文字に対して復元した文字列を１行に出力して下さい。

Sample Input

ab@5C1@8050
@99+1=1@90

Output for the Sample Input

abCCCCC10000000050
999999999+1=1000000000


最短経路

図１に例示するように整数（0 以上 99 以下）をひしがたに並べます。このような、ひしがたを表すデータを読み込んで、一番上からスタートして一番下まで次のルールに従って進むとき、通過する整数の和の最大値を出力するプログラムを作成してください。

各ステップで、対角線上の左下か対角線上の右下に進むことができます。

例えば図1の例では、図2に示すように、7,3,8,7,5,7,8,3,7を選んで通ったとき、その和は最大の 55 （7+3+8+7+5+7+8+3+7=55） となります。

Input

入力例に示すように、カンマで区切られた整数の並びが、ひし形状に与えられます。各行に空白文字は含まれません。入力例は図１に対応しています。
データの行数は 100 行未満です。

Output

ルールに従って通過する整数の和の最大値を１行に出力します。

Sample Input

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

Sample Output

55


def calc(a, b)
  (a[0] - b[0]) ** 2 + (a[1] - b[1]) ** 2 <= 4
end
while n = gets.to_i
  break if n == 0
  dots = Array.new(n)
  cnt = Array.new(n,1)
  n.times {|i| dots[i] = gets.split(",").map(&:to_f)}
  n.times do |i|
    ((i+1)...n).each do |j|
      if calc(dots[i], dots[j])
        cnt[i] += 1
        cnt[j] += 1
      end
    end
  end
  p cnt.max
end

シールの重なり

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

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

Input

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

n
x1,y1
x2,y2
:
xn,yn

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

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

Output

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

Sample Input

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

Output for the Sample Input

4

Hint

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

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

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


puts gets.split.map(&:to_i).inject(:*) / 3.305785

坪面積の計算

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

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

入力

a b

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

出力

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

入力例1

15 25

出力例1

113.437508


a,b = gets.split.map(&:to_i)
m = a * b
puts (m / 3.305785).round(6).to_f


a_max, v_max = 0, -1

gets.to_i.times do
  a, v = gets.split.map(&:to_i)
  a_max, v_max = a, v if v_max < v
  a_max = a if v_max == v && a < a_max
end

puts "#{a_max} #{v_max}"

ワカサギ釣り大会

桧原湖でワカサギ釣り大会が行われました。一番多くのワカサギを獲得した人が優勝者です。

参加者番号と釣った匹数のリストを読み込み、優勝者の番号と釣った匹数を出力するプログラムを作成してください。優勝者が複数いる場合は、その中で参加者番号が最も小さい一人を出力してください。

入力

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

n
a1 v1
a2 v2
:
an vn

n (1 ≤ n ≤ 20) は参加者の数、ai は参加者番号を表す。参加者番号は 1 以上 n 以下の異なる整数である。vi ( 0 ≤ vi ≤ 100) は参加者 ai が獲得した匹数である。

出力

優勝者の参加者番号と釣った匹数を空白区切りで１行に出力せよ。

入力例

6
1 14
2 25
3 42
4 11
5 40
6 37

出力例

3 42


４つの整数の和 II

4,000 以下の正の整数 n を入力し、0 〜 1000 の範囲の整数 a, b, c, d の組で

a + b + c + d = n

を満たすものの組み合わせ数を出力するプログラムを作成して下さい。

Input

複数のデータセットが与えられます。各データセットに n が１行に与えられます。入力の最後まで処理して下さい。

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

Output

各データセットごとに、a, b, c, d の組み合わせの個数を１行に出力して下さい。

Sample Input

2
3
35

Output for the Sample Input

10
20
8436


while (n=gets.to_i)!=0
  h=Hash.new
  n.times do
    id,val,amo=gets.split.map(&:to_i)
    h.key?(id) ? h[id]+=(val*amo) : h.store(id,val*amo)
  end
  ans=h.select{|k,v| v>=1000000}
  puts ans.empty? ? "NA" : ans.keys
end

Sale Result

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

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

Input

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

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

Output

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

Sample Input

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

Output for the Sample Input

1001
1003
NA
2013


gets.to_i.times do
  puts gets.gsub("Hoshino", "Hoshina")
end

Aizu PR

An English booklet has been created for publicizing Aizu to the world.
When you read it carefully, you found a misnomer (an error in writing) on the last name of Masayuki Hoshina, the lord of the Aizu domain. The booklet says "Hoshino" not "Hoshina".

Your task is to write a program which replace all the words "Hoshino" with "Hoshina". You can assume that the number of characters in a text is less than or equal to 1000.

Input

The input consists of several datasets. There will be the number of datasets n in the first line. There will be n lines. A line consisting of english texts will be given for each dataset.

Output

For each dataset, print the converted texts in a line.

Sample Input

3
Hoshino
Hashino
Masayuki Hoshino was the grandson of Ieyasu Tokugawa.

Output for the Sample Input

Hoshina
Hashino
Masayuki Hoshina was the grandson of Ieyasu Tokugawa.


while (n=gets.to_i)!=0
  mat=Array.new(n+1){Array.new(n+1,0)}
  ans=Array.new(n+1){Array.new(n+1)}
  n.times.with_index do |id|
    mat[id]=gets.split.map(&:to_i)
    mat[id][n]=mat[id].inject(:+)
    (n+1).times.with_index do |id2|
      mat[n][id2]+=mat[id][id2]
    end
  end
  mat.each.with_index do |item,id|
    item.each.with_index do |ss,id2|
      ans[id][id2]=format("%5d",ss)
    end
  end
  ans.each do |line|
    puts line.join(" ")
  end
end

Matrix-like Computation

Your task is to develop a tiny little part of spreadsheet software.

Write a program which adds up columns and rows of given table as shown in the following figure:

Input

The input consists of several datasets. Each dataset consists of:

n (the size of row and column of the given table)
1st row of the table
2nd row of the table
:
:
nth row of the table

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

Output

For each dataset, print the table with sums of rows and columns. Each item of the table should be aligned to the right with a margin for five digits. Please see the sample output for details.

Sample Input

4
52 96 15 20
86 22 35 45
45 78 54 36
16 86 74 55
4
52 96 15 20
86 22 35 45
45 78 54 36
16 86 74 55
0

Output for the Sample Input

52 96 15 20 183
86 22 35 45 188
45 78 54 36 213
16 86 74 55 231
199 282 178 156 815
52 96 15 20 183
86 22 35 45 188
45 78 54 36 213
16 86 74 55 231
199 282 178 156 815


class BaseBall
  def initialize
    @first=false
    @second=false
    @third=false
    @out=0
  end

  def hit
    if @third then
      point=1
    else
      point=0
    end
    @third = false
    @third  = true if @second
    @second = true if @first
    @first = true
    return point
  end

  def homerun
    point= [@first,@second,@third].select{|x| x}.length + 1
    @first,@second,@third =false
    return point
  end

  def out
    @out += 1
    if @out>= 3 then
      @out=0
      return true
    else
      return false
    end
  end
end
if true then
  fh=STDIN
else
  fh=open("in0103.txt")
end
n= fh.gets.chomp.to_i
0.upto(n-1) { |i|
  point=0
  bb = BaseBall.new
  while fh.gets do
    s = $_.chomp
    if s=="HIT" then
      point += bb.hit
    elsif s=="HOMERUN" then
      point += bb.homerun
    elsif s=="OUT" then
      if bb.out then
        puts point
        break
      end
    end
  end
}

Baseball Simulation

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

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

Single hit

put a runner on the first base.

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

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

Home run

all the runners on base advance to the home base.

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

Out

The number of outs is increased by 1.

The runners and the score remain stationary.

The inning ends with three-out.

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

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

Input

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

Output

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

Sample Input

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

Output for the Sample Input

7
0


left=gets.to_i
out,runner,score=0,0,0
while left>0
  judge=gets.chomp
  case judge
  when "HIT" then
    runner+=1
    if runner>3 then
      runner-=1
      score+=1
    end
  when "OUT" then
    out+=1
    if out>=3 then
      puts score
      runner,score=0,0
      left-=1
    end
  when "HOMERUN" then
    score+=(runner+1)
    runner=0
  end
end


$<.gets.to_i.times do
	point = 0
	out = 0
	runner = 0

	while out < 3
		case $<.gets.chomp
		when 'HIT'
			runner == 3 ? point += 1 : runner += 1
		when 'OUT'
			out += 1
		when 'HOMERUN'
			point += runner + 1
			runner = 0
		end
	end

	p point
end


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


class Hoge
  def / (x)
    y = self.to_f.fdiv(x)
    if y < 0.0
      y = y.ceil
    else
      y = y.floor
    end
    y
  end
end

while n = gets.to_i
	n.times{
    	puts eval(gets.chomp.chop)
	}
end


if true then
  fh=STDIN
else
  fh=open("in1_0112.txt")
end
n=-999

while fh.gets do
  n=$_.chomp.to_i
  break if n==0
  f=[]
  0.upto(n-1){|i| f[i]=fh.gets.chomp.to_i}

  g=f.sort
  acc=0
  h=g.map{|x|
    acc0=acc
    acc+=x
    acc0}
  puts h.inject(0){|acc,x| acc+x}
end
abort("input strange") if n!=0

ミルクショップ

鈴木さんは会津地域に新しく搾りたてミルクの移動販売のお店を開きました。その日買い求めに来るお客さんは全員持ち帰るためのボトルを持って既にお店に並んでいて、それ以上増えないものとします。お客さんはそれぞれ1回だけしか注文しません。タンクの蛇口が一つしかないので、一人ずつ順番に販売しなければなりません。そこで、鈴木さんはなるべく並んでいるお客さんの待ち時間を少なくしたいと考えています。

お客さんの人数とお客さんが牛乳を注ぎきるのに要する時間が入力として与えられます。あなたはお客さんの「一人一人の待ち時間の合計」(以下「待ち時間の合計」とする)を最小にするための注文の順序を鈴木さんに代わって調べ、そのときの「待ち時間の合計」を出力して終了するプログラムを作成してください。ただし、お客さんは 10,000 人以下で 1 人あたりに要する時間は 60 分以下とします。

例えば、お客さんの人数が 5 人で、各お客さんが要する時間が順に 2,6,4,3,9 分の場合、そのままの順序だと「待ち時間の合計」は 37 分になります。次の例では、最初の列の順の 2 人目と 3 人目を入れ替えています。この場合、「待ち時間の合計」は 35 分になります。最適な順序だと 31 分で済みます。

待ち時間

1 人目 2 分

0 分

2 人目 6 分

2 分

3 人目 4 分

8 分

4 人目 3 分

12 分

5 人目 9 分

15 分

37 分

← 「待ち時間の合計」

2 人目と 3 人目を入れ替えた例

待ち時間

1 人目 2 分

0 分

2 人目 4 分

2 分

3 人目 6 分

6 分

4 人目 3 分

12 分

5 人目 9 分

15 分

35 分

← 「待ち時間の合計」

Input

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

n
t1
t2
:
tn

1 行目にお客さんの人数 n (n ≤ 10,000) が与えられます。続く n 行に i 人目のお客さんが要する時間を表す整数 ti (0 ≤ ti ≤ 60) がそれぞれ１行に与えられます。

入力は１つの 0 を含む行で終わります。データセットの数は 50 を超えません。

Output

各データセットごとに、待ち時間の合計(整数)を１行に出力してください。

Sample Input

5
2
6
4
3
9
0

Output for the Sample Input

31


loop do
  n = gets.to_i
  break if n.zero?
  teams = {}

  n.times do
    team_and_score = gets.chomp.split
    team = team_and_score.first
    wld = team_and_score[1..-1].map(&:to_i)
    score = 3*wld[0] + wld[2]
    if teams[score].nil?
      teams[score] = [team]
    else
      teams[score] << team
    end
  end

  teams.sort.reverse.each do |score_teams|
    s = score_teams.first
    score_teams.last.each{ |t| puts "#{t},#{s}"}
  end
end

リーグ戦のスコアシート

スポーツの大会にはリーグ戦とトーナメント戦があります。サッカーのリーグ戦では勝・負・引分にそれぞれ点数を付け、その勝ち点で順位を競います。勝ち点はそれぞれ勝(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


$eye_data = [[0, 0, 0, 0], [0, 0, 0, 0]]

def check(vision, lr)
  case
  when 1.1 <= vision
    $eye_data[lr][0] += 1
  when 0.6 <= vision
    $eye_data[lr][1] += 1
  when 0.2 <= vision
    $eye_data[lr][2] += 1
  else
    $eye_data[lr][3] += 1
  end
end

readlines.each do |line|
  l, r = line.chomp.split.map(&:to_f)
  check(l, 0)
  check(r, 1)
end

0.upto(3) do |i|
  puts "#{$eye_data[0][i]} #{$eye_data[1][i]}"
end

視力検査

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

判定

視力

A

1.1 以上

B

0.6 以上 1.1 未満

C

0.2 以上 0.6 未満

D

0.2 未満

Input

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

l1 r1
l2 r2
l3 r3
:
:

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

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

Output

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

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

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

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

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

Sample Input

1.0 1.2
0.8 1.5
1.2 0.7
2.0 2.0

Output for the Sample Input

2 3
2 1
0 0
0 0


loop do
  m = gets.to_i
  break if m.zero?
  m.times.map do
    id, *ss = gets.split.map(&:to_i)
    s, i = 0, 0
    10.times do |j|
      if ss[i] == 10
        s += ss[i] + ss[i+1] + ss[i+2]
        i += 1
      elsif ss[i] + ss[i+1] == 10
        s += ss[i] + ss[i+1] + ss[i+2]
        i += 2
      else
        s += ss[i] + ss[i+1]
        i += 2
      end
    end
    [-s, id]
  end.sort!.each {|s, id| puts "#{id.to_i} #{-s}" }
end

ボウリング

クラスのレクリエーションとしてボウリングを行うことになりました。参加者ごとの投球情報を入力とし、得点の高い順に成績情報を出力するプログラムを作成してください。なお、同点の場合は学籍番号の若い順に出力してください。ただし参加者は 3 名以上 40 名以下とし、1人当たり1ゲームずつ投球しているものとします。

ボウリングとは、プレイヤーに対して頂点を向けて正三角形に並べられた、10 本のピンをめがけてボールを転がし、ピンを倒すスポーツです。 1 回目の投球ですべて転倒した場合をストライクと言い、その投球のみで次のフレームに進みます。ストライクでない場合は、残ったピンをそのままにして 2 回目の投球を行います。2 回目の投球ですべて転倒した場合をスペアと言います。2 回目の投球終了後、次のフレームに進みます。

1 ゲームは 10 のフレームから構成され、第 1 から第 9 の各フレームは 2 回投球できます。各フレームの開始時点では、10 本のピンがすべて立った状態で用意されます。第 10 フレームは、ストライクもしくはスペアが出た場合には計 3 回の投球を、それ以外の場合は 2 回の投球を行い、ゲーム終了となります。

スコア例１

スコア例２（最高得点300点の場合）

スコア計算の方法

各フレームにおいてスペア、ストライクがない場合は、 2 回の投球で倒したピンの本数がそのフレームの得点となります。（スコア例１の第 4 フレームと第 8 フレーム）

スペアを出した場合、倒した本数である 10 点に加え、次の投球で倒したピンの本数がこのフレームの得点に加算されます。（スコア例１の第 1 フレームと第 2 フレームの関係など）スコア例１の第 1 フレームでは第 2 フレームの 1 投で倒した 10 本（点）を加えた 20 点が得点となります。第 3 フレームも同様の計算方法です。

ストライクを出した場合、倒した本数である 10 点に加え、続く 2 回の投球で倒したピンの本数が加算されます。（スコア例１の第 2 フレームと第 3 フレームの関係など）もちろん続く 2 投中にストライクの場合があります。（スコア例１の第 5 フレームと第 6、7 フレームの関係など）

第 10 フレームのみ、スペア、ストライクを出した場合、3 投して倒したピンの総数が第 10 フレームの得点として加算されます。

各フレームの得点の合計が 1 ゲームの得点となり、最高得点は 300 点となります。

Input

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

m
score1
score2
:
scorem

1行目に参加者数 m （3 ≤ m ≤ 40）、続くm 行にi 人目の参加者情報 scorei が与えられます。各参加者情報は１行ずつ次の形式で与えられます。

id s1 s2 ... sn

先頭に学籍番号id (0 ≤ id ≤ 9999)、続いて第 j 投の転倒ピン数 sj (0 ≤ sj ≤ 10) が与えられます。総投球数 n は、12 以上 21 以下であり、得点計算に必要なピン数が過不足なく与えられるものとします。

Output

入力データセットごとに、学籍番号と得点を、得点の高い順（同点の場合は学籍番号の若い順）に出力します。学籍番号と得点を１つの空白で区切って１行に出力してください。

Sample Input

3
1010 6 3 10 7 1 0 7 9 1 10 6 2 4 3 9 1 9 0
1200 5 3 9 1 7 1 0 0 8 1 10 10 4 3 9 1 8 2 9
1101 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
4
3321 8 2 10 9 1 7 0 10 10 10 0 8 10 10 10 10
3332 5 0 10 9 1 4 1 9 0 10 10 7 1 5 2 8 1
3335 10 10 10 10 10 10 10 10 10 10 10 10
3340 8 2 7 3 6 4 8 2 8 2 9 1 7 3 6 4 8 2 9 1 7
0

Output for the Sample Input

1200 127
1010 123
1101 60
3335 300
3321 200
3340 175
3332 122


def gcd a,b
  res = 0
  while b!=0
    res+=1
    a,b=b,a%b
  end
  [a,res]
end

loop do
  a,b=gets.chomp.split.map{|x| x.to_i }
  break if a|b==0
  puts (gcd a,b).join(' ')
end

最大公約数-ユークリッドの互除法

最大公約数は、コンピュータ上で扱う数学には欠かせない要素です。最大公約 数を使うことで、計算の効率が大きく変動することもあります。最大公約数を求めるアルゴリズムのひとつが「ユークリッドの互除法」です。その処理 の流れを以下に示します。

例えば 1071 と 1029 の場合、1071 を X 、1029 を Y に代入して、

       1071 ÷ 1029 の余りは 42 、X に 42 を代入して X と Y を入れ替える。 (1 ステップ)

       1029 ÷ 42 の余りは 21 、X に 21 を代入して X と Y を入れ替える。 (2 ステップ)

       42 ÷ 21 の余りは 0 、X に 0 を代入して X と Y を入れ替える。 (3 ステップ)

Y が 0 になったので、この時の X が最大公約数となる。よって最大公約数は 21 。

このように、たったの 3 ステップで 1071 と 1029 の最大公約数を求めることが出来ました。ユークリッドの互除法は約数を出して比較していく方法に比べ、圧倒的に早く結果を出してくれます。

２つの整数を入力とし、ユークリッドの互除法を用いて最大公約数を求め、その最大公約数と計算にかかったステップ数を出力するプログラムを作成してください。

Input

複数のデータセットの並びが入力として与えられます。入力の終わりはゼロふたつの行で示されます。
各データセットとして２つの整数 a, b (2 ≤ a, b ≤ 231-1) が１行に与えられます。

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

Output

データセットごとに、入力された２つの整数の最大公約数と、計算にかかったユークリッドの互除法のステップ数を空白区切りで１行に出力します。

Sample Input

1071 1029
5 5
0 0

Output for the Sample Input

21 3
5 1


#!/usr/bin/ruby -Ku

require 'pp'

def check_lowest(item, shop, recipe)
  if recipe.include?(item) then
    sum = 0
    recipe[item].each{ |it|
      tmp = check_lowest(it, shop, recipe)
      sum += tmp
    }
    return [sum, shop[item]].min
  else
    return shop[item] || 0
  end
end

loop do
  n = gets.to_i
  break if n == 0

  shop = Hash.new
  n.times{
    data = gets.split(nil)
    shop[data[0]] = data[1].to_i
  }

  m = gets.to_i

  recipe = Hash.new
  m.times{
    data = gets.split(nil)
    item, n = data
    recipe[item] = data.slice(2, n.to_i)
  }

  item = gets.split(nil)[0]

  puts check_lowest(item, shop, recipe)
end

錬金マスター

あなたはついに魔法の釜、錬金釜を手に入れました。錬金釜に複数のアイテムを入れると、新しいア イテムを作ることができます。新しく作ったアイテムは、他のアイテムを作るために錬金釜へ入れることもできます。アイテムを作るために必要なアイテムのリストを記したものを錬金レシピと呼ぶことにします。以下の 3 つは錬金レシピの例です。

木片と糸でラケットができる。

お米と水でおにぎりができる。

ラケットとマイクとおにぎりでギターができる。

アイテムはお金を使って手にいれることもできますが、錬金釜で作った方が安くすむ場合もあります。例えば、各アイテムの購入価格が以下のように与えられているとします。

アイテム名

購入価格(円)

木片

3,000

糸

800

お米

36

水

0

ラケット

5,000

マイク

9,800

おにぎり

140

ギター

98,000

ラケットは 5,000 円で購入できますが、木片と糸を購入して錬金すれば 3,800 円で手に入れられます。更に、錬金を重ねることによりとてもお得にアイテムを手に入れられます。図 1 は上記 3 つの錬金レシピ例を組み合わせたものです。ギターは 98,000 円で購入できますが、木片、糸、お米、水、マイクを購入して錬金すれば、たったの 13,636 円で手に入れられます。

図 1

あなたは冒険を楽に進めるため、なるべく安く目的のアイテムを手に入れようと考えました。 アイテムのリスト、錬金レシピのリスト、指定されたアイテムを入力とし、指定されたアイテムを作るために必要な金額の最小値を出力するプログラムを作成して下さい。

各アイテムの数量に限りはないものとします。アイテムは複数のレシピに使われることがありますが、1 つのアイテムを作るためのレシピはたかだか 1 つです。また、あるアイテムを起点としてレシピをたどっていったとき、そのアイテムが再びレシピに現れることはありません。

Input

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

n
s1 p1
s2 p2
:
sn pn
m
o1 k1 q1 q2 ... qk1
o2 k2 q1 q2 ... qk2
:
om km q1 q2 ... qkm
t

1 行目にリストに含まれるアイテムの種類数 n (1 ≤ n ≤ 100) が与えられます。続く n 行に i 番目のアイテムの名前 si (1 文字以上 100 文字以下のアルファベットからなる半角文字列) とそれを購入する場合の値段 pi (0 ≤ pi ≤ 1000000)が与えられます。

続く行に錬金レシピの数 m (0 ≤ m ≤ 100) が与えられます。続く m 行に i 番目のレシピの情報が与えられます。各レシピとして、アイテムの名前 oi、それを作るために必要なアイテムの個数 ki (1 ≤ ki ≤ 100) 、 ki 個のアイテム名 q1, q2 ... qki が与えられます。

最後の行に指定されたアイテム名 t が与えられます。

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

Output

入力データセットごとに、最小の値段を１行に出力します。

Sample Input

8
wood 3000
string 800
rice 36
water 0
racket 5000
microphone 9800
onigiri 140
guitar 98000
3
racket 2 wood string
onigiri 2 rice water
guitar 3 racket microphone onigiri
guitar
1
computer 300000
0
computer
0

Output for the Sample Input

13636
300000


until [0,0] == (num,max = gets.split.map &:to_i)
  next if num.nil?
  ary = gets.split.map &:to_i
  ary.sort!{|a, b| b <=> a }
  c,sum = 0,0
  ary.each do |x|
    c+=1
    sum+=x if ((c%max)!=0)
  end
  p sum
end

お客様大感謝祭

悪天候が続き野菜の価格が高騰する中、セブンマートではお客様に野菜のまとめ買いセールを実施しています。 日ごろなかなか店頭に並ばない野菜もお手頃価格で手に入るとあって、 店内はとても賑わっています。

ある日、松長団地に住む仲良し 3 人組がセブンマートの広告を手に話に花を咲かせていました。今回のセールは「お客様大感謝祭」と銘打っただけに、袋詰めした野菜の中で最も安いものが無料になるのが目玉となっています。広告を読んでみると、どうやら以下のようなセールのようです。

1 つの袋には m 個まで野菜を詰められる。

野菜が m 個詰めてある袋については、その中で最も安い野菜が無料となる。

野菜の個数が m 個に達しない袋は割引の対象外。

3人は早速セブンマートへ買い物に行きました。

買い物が終わり、 お店の外で待ち合わせた 3 人は安くてたくさん購入できたことに満足した様子で話をしていると、どうやら 3 人とも同じ野菜を購入していたことが分かりました。ある一人が、「本当に安いわよねぇ。これでXXX円だもの!」と言うと、もう一人は、「え?私はそれより**円高かったわ!どうして?」と驚き、また、残りの一人はレシートを見て自分が一番安く購入したことに気付きました。

さて、どのように袋詰めすれば購入価格を一番安くできるでしょうか。 購入する野菜の個数、袋に入る野菜の個数、各野菜の値段を入力とし、最低購入価格を出力するプログラムを作成してください。

Input

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

n m
p1 p2 ... pn

1 行目に購入する野菜の個数 n (1 ≤ n ≤ 1000) と袋に入る野菜の個数 m (1 ≤ m ≤ 1000)　が与えられます。２行目に各野菜の値段 pi (10 ≤ pi ≤ 10000) が与えられます。

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

Output

入力データセットごとに、最低購入価格を１行に出力します。

Sample Input

4 2
50 40 100 80
7 3
400 300 100 700 200 600 500
0 0

Output for the Sample Input

150
2100


a=gets.to_i
s=gets.to_i
d=gets.to_i
f=gets.to_i
g=gets.to_i
h=gets.to_i
j=gets.to_i
k=gets.to_i
l=gets.to_i
p=gets.to_i
print("#{a+s+d+f+g+h+j+k+l+p}\n")

10問解いたら何点取れる？

選手の皆さん、パソコン甲子園にようこそ。パソコン甲子園は今年で10周年になりますが、出題される問題数や合計得点は年によって異なります。各問題には難易度に応じて得点が決められています。問題数が10問で、それぞれの問題の得点が与えられるとき、それらの合計を出力するプログラムを作成して下さい。

入力

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

s1
s2
.
.
s10

入力は10行からなり、i 行目に問題 i の得点を表す整数 si (0≤ si ≤ 100)が与えられる。

出力

合計得点を１行に出力する。

入力例1

1
2
3
4
5
6
7
8
9
10

出力例1

55

入力例2

4
4
8
8
8
10
10
12
16
20

出力例2

100


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

実数既約分数化

実数のうち、小数部が循環するものと有限桁のものは分数として表すことができます。

分数で表すことができる実数が与えられたとき、その実数と等しい既約分数（それ以上約分できない分数）を出力するプログラムを作成せよ。

Input

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

str

１行に、変換したい実数を表す文字列 str が与えられる。実数の値は 0 より大きい。文字列は数字か「.」、「(」、「)」を含む、長さが 3 以上 8 以下の文字列である。「.」は小数点、「(」は数字の循環の始まり、「)」は数字の循環の終わりを示す。整数部にも小数部にも、必ず１桁以上の数字が与えられるとする。ただし、循環小数が与えられた場合、文字列は以下の条件を満たす。

循環の始まりと終わりのペアは、小数点の右側に一度だけ現れる。

循環の終わりを示す「)」は、文字列の末尾に現れる。

循環の始まりと終わりの間には、必ず１桁以上の数字が与えられる。

Output

実数を既約分数で表した形式（分子の整数に続けて「/」区切りで分母の整数を並べたもの）で出力する。

Sample Input 1

0.(3)

Sample Output 1

1/3

Sample Input 2

1.0

Sample Output 2

1/1

Sample Input 3

5.2(143)

Sample Output 3

52091/9990

Sample Input 4

0.0739

Sample Output 4

739/10000


n, c = gets.chomp.split.map(&:to_i)
sum = gets.chomp.split.map(&:to_i).inject(:+)
q, r = sum.divmod(n + 1)
puts (r == 0) ? q : q + 1

Cake Party

I’m planning to have a party on my birthday. Many of my friends will come to the party. Some of them will come with one or more pieces of cakes, but it is not certain if the number of the cakes is a multiple of the number of people coming.

I wish to enjoy the cakes equally among the partiers. So, I decided to apply the following rules. First, all the party attendants are given the same number of cakes. If some remainder occurs, a piece goes on a priority basis to the party host (that’s me!). How many pieces of cake can I enjoy?

Given the number of my friends and cake information, make a program to calculate how many pieces of cake I can enjoy. Note that I am not counted in the number of my friends.

Input

The input is given in the following format.

$N$ $C$
$p_1$ $p_2$ ... $p_C$

The first line provides the number of my friends $N$ ($1 \leq N \leq 100$) and the number of those among them who brought one or more pieces of cake with them $C$ ($1 \leq C \leq N$). The second line provides an array of integers $p_i$ ($1 \leq p_i \leq100$), each of which shows the number of cakes of the $i$-th friend of mine who was willing to come up with one or more pieces of cake.

Output

Output the number of cakes I can enjoy.

Sample Input 1

5 4
5 5 6 5

Sample Output 1

4

Sample Input 2

7 5
8 8 8 8 8

Sample Output 2

5

Sample Input 3

100 3
3 3 3

Sample Output 3

1


result1 = Array.new
result2 = Array.new
n=1
while true
	n = gets.to_i
	if n==0
	break
	end
	score1=0
	score2=0
	n.times do
num1,num2 = gets.split.map(&:to_i)
if num1>num2
	score1 += num1+num2
elsif num1<num2
	score2+= num1+num2
else
	score1 += num1
	score2 += num2
end
end
result1.push(score1)
result2.push(score2)
end

while !result1.empty?
puts "#{result1.shift} #{result2.shift}"
end

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

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

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

入力例１

入力例２

入力例３

3

3

3

9 1

9 1

9 1

5 4

5 4

5 5

0 8

1 0

1 8

出力例１

出力例２

出力例３

19 8

20 0

15 14

入力

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

出力

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

入力例

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

出力例

19 8
20 0
15 14

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

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


class Dice
  def init
    @up_value    = 1
    @front_value = 2
    @right_value = 3
    @left_value  = 4
    @back_value  = 5
    @down_value  = 6
  end

  def move_north
    tmp = [@front_value, @up_value, @back_value, @down_value]
    @up_value, @back_value, @down_value, @front_value = tmp
  end

  def move_east
    tmp = [@left_value, @up_value, @right_value, @down_value]
    @up_value, @right_value, @down_value, @left_value = tmp
  end

  def move_west
    tmp = [@right_value, @up_value, @left_value, @down_value]
    @up_value, @left_value, @down_value, @right_value = tmp
  end

  def move_south
    tmp = [@back_value, @up_value, @front_value, @down_value]
    @up_value, @front_value, @down_value, @back_value = tmp
  end

  def move_right
    tmp = [@right_value, @front_value, @left_value, @back_value]
    @front_value, @left_value, @back_value, @right_value = tmp
  end

  def move_left
    tmp = [@left_value, @front_value, @right_value, @back_value]
    @front_value, @right_value, @back_value, @left_value = tmp
  end

  def up_value
    @up_value
  end
end

dice = Dice.new
answers = []

while (num = gets.to_i) != 0
  dice.init
  sum = 1
  num.times do
    operation = gets

    case operation
    when "North"
      dice.move_north
    when "East"
      dice.move_east
    when "West"
      dice.move_west
    when "South"
      dice.move_south
    when "Right"
      dice.move_right
    when "Left"
      dice.move_left
    end

    sum += dice.up_value
  end
  answers << sum
end

puts answers

サイコロが以下の図のような向きで置かれている．

ここで使用するサイコロは，この図のように，上側に 1，南側に 2 があるときは，東側に 3 があるものとする．サイコロの向かいあう面の和は必ず 7 なので，見えない面はそれぞれ北側 5，西側 4，下側 6 になっている．

　この初期配置の状態から指示に従ってサイコロを動かしていく．ただし，指示は以下の 6 通りの操作を何回か行うものである．

North，East，South，West の各操作は指示された方向へサイコロを 90 度回転させる．
　Right，Left の 2 つの操作は上下の面はそのままで水平方向に 90 度回転させる．（回転させる向きに要注意．）

　初期配置で上の面に出ている目 1 を初期値とし， 1 回の操作が終わるたびに，上の面に出ている目の数を加算していき，指示にしたがってすべての操作を終えたときの合計値を出力するプログラムを作成しなさい.

　入力ファイルの 1 行目には総指示回数 n が書かれていて，続く n 行の各行には「North，East，South，West，Right，Left」のいずれか 1 つの指示が書かれているものとする．ただし， n ≦ 10000 とする．

入力例１

入力例２

5

8

North

West

North

North

East

Left

South

South

West

Right

North

Left

East

出力例１

出力例２

21

34

入力

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

出力

データセットごとに、合計値を１行に出力する．

入力例

5
North
North
East
South
West
8
West
North
Left
South
Right
North
Left
East
0

出力例

21
34

各データセットの出力（合計値）の後に改行を入れること。

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


class Himo
  attr_accessor :id, :es
  def initialize(id, es)
    @id = id
    @es = es
  end
  def the_other_side(e)
    if e == @es[0]
      @es[1]
    elsif e == @es[1]
      @es[0]
    else
      puts "error"
    end
  end
  def to_s
    "#{@id}, [#{@es[0]},#{@es[1]}]"
  end
end

def rec(m, himos, len)
  if himos[m].nil? || himos[m].empty?
    return len
  else
    max_len = 0
      himos[m].each do |himo|
        l = himo.the_other_side(m)
        himos_copy = himos.dup
        puts "error2" unless himos_copy.delete(m)
        new_len = rec(l, himos_copy, len+1)
        max_len = new_len > max_len ? new_len : max_len
      end
    return max_len
  end

end

while (n = gets.to_i) != 0 do
  himos = {}
  es_nums = []
  0.upto(n-1) do |i|
    es = gets.split(" ").map(&:to_i)
    es.each do |num|
        himos[num] = [] if himos[num].nil?
        himos[num] << Himo.new(i, es)
    end
  end
  lens = []
  himos.each_key {|m| lens << rec(m, himos, 0)}
  puts lens.max
end

両端にリングのついた紐を考える.リングは正整数が付いていて,紐を区別する.紐の両端のリングには異なる数 a, b が付けられる.これを,[a, b] と記述する.複数の紐があり,一方の紐と他方の紐のリングに付いている数が同じ場合,そのリングのところで,これらの紐をつなげることができて,つなげてできたものを鎖と呼ぶことにする.例えば,[1, 3] と [3, 4] という紐からは [1, 3, 4] という鎖ができる.紐と鎖や鎖同志も同じ整数が付いているリングのところでつなげることができるものとする.

例えば,鎖 [1, 3, 4] と紐 [5, 1] からは [5, 1, 3, 4] ができ,鎖 [1, 3, 4] と鎖 [2, 3, 5] からは, 中央でクロスしたような形になる.鎖 [1, 3, 4] と鎖 [4, 6, 1] からは, 輪の形ができる.

このように様々な形ができるが, そのうちの一部で,同じ数の付いたリングは一度だけたどるつながった複数の紐を鎖と呼ぶことにする.例えば,鎖 [1, 3, 4] と鎖[2, 3, 5] からできる,中央でクロスしたような形には, [1, 3, 5],[2, 3, 4] という鎖も含まれ,鎖 [1, 3, 4] と鎖 [4, 6, 1] からできる輪には, [1, 3, 4, 6],[3, 4, 6, 1],[4, 6, 1, 3]などの鎖が含まれる.

これらの鎖に対して,含まれる数の個数を長さと定義する. 与えられた複数の紐に対して,つなげられるものはすべてつなげると1つ以上の
鎖を含む形ができる.そのうちの最大の鎖の長さを求めるプログラムを作成せよ.

入力データ の最初の行には紐の個数である正整数 1 ≤ n ≤ 100 が書いてあり,つづく n 行のそれぞれには, 空白で区切られた 2 つの整数 a, b が書いてあり 1 ≤ a < b ≤ 100 となっている.各行の 2 つの整数は 1 つの紐の両端の整数を表わす.

入力例１

入力例２

入力例３

7

6

7

1 3

1 2

1 3

3 4

2 3

2 4

1 4

3 4

3 5

2 7

4 5

4 6

5 7

1 5

6 7

6 7

2 6

2 6

1 7

4 7

出力例１

出力例２

出力例３

5

6

4

入力

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

出力

データセットごとに、最大の鎖の長さを１行に出力する．

入力例

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

出力例

5
6
4

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


#encoding:utf-8 No.0522 2014.12.11
while gets
  joi = 0
  ioi = 0
  i = 0

  while i < $_.length - 2
    if $_[i,3] == "JOI"
      joi += 1
    end

    if $_[i,3] == "IOI"
      ioi += 1
    end
  end

  puts joi,ioi
end

JOIとIOI

問題

与えられた文字列内の連続する3文字が，JOIまたはIOIという並びになっている個所がそれぞれ何個所あるのかを数え上げるプログラムを作成せよ．文字列はアルファベットの大文字だけからなる．例えば下図の「JOIOIOI」という文字列にはJOIが1個所，IOIが2個所に含まれている．

入力

入力は複数のデータセットからなる．各データセットは1行であり，10000文字以下のアルファベットの大文字からなる．入力は EOF で終了する.

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

出力

データセットごとに, 1行目に見つかったJOIの個数，2行目に見つかったIOIの個数をそれぞれ出力せよ．

入出力例

入力例

JOIJOI
JOIOIOIOI
JOIOIJOINXNXJIOIOIOJ

出力例

2
0
1
3
2
3

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


loop {
    n = gets.to_i
    break if n == 0
    gets
    str = gets.chomp
    chunks = str.scan(/((IO)+I)/).map{|s, _| (s.size - 1) / 2}
    count = 0
    chunks.each{|c|
        count += c - n + 1 if c >= n
    }
    p count
}

IOIOI

問題

整数 n (1 ≤ n) に対し, n + 1 個の I と n 個の O を I から始めて交互に並べてできる文字列を Pn とする.ここで I と O はそれぞれ英大文字のアイとオーである.

P1

IOI

P2

IOIOI

P3

IOIOIOI

.

.

.

Pn

IOIOIO ... OI (O が n 個)

図 1-1 本問で考える文字列 Pn

整数 n と, I と O のみからなる文字列 s が与えられた時, s の中に Pn が何ヶ所含まれているかを出力するプログラムを作成せよ.

例

n が 1, s が OOIOIOIOIIOII の場合, P1 は IOI であり,下図 1-2 に示した 4ヶ所に含まれている.よって,出力は 4 である.

OOIOIOIOIIOII

OOIOIOIOIIOII

OOIOIOIOIIOII

OOIOIOIOIIOII

図 1-2 n が 1, s が OOIOIOIOIIOII の場合の例

n が 2, s が OOIOIOIOIIOII の場合, P2 は IOIOI であり,下図 1-3 に示した 2ヶ所に含まれている.よって,出力は 2 である.

OOIOIOIOIIOII

OOIOIOIOIIOII

図 1-3 n が 2, s が OOIOIOIOIIOII の場合の例

入力

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

1 行目には整数 n (1 ≤ n ≤ 1000000) が書かれている.

2 行目には整数 m (1 ≤ m ≤ 1000000) が書かれている. m は s の文字数を表す.

3 行目には文字列 s が書かれている. s は I と O のみからなる.

全ての採点用データで, 2n + 1 ≤ m である.採点用データのうち, 配点の 50% 分については, n ≤ 100, m ≤ 10000 を満たす.

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

出力

データセットごとに,文字列 s に文字列 Pn が何ヶ所含まれるかを表す 1 つの整数を1 行に出力する. s に Pn が含まれていない場合は,整数として 0 を出力せよ.

入出力例

入力例

1
13
OOIOIOIOIIOII
2
13
OOIOIOIOIIOII
0

出力例

4
2

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


total = gets.to_i

sum = 0
loop do
    data = gets.to_i
    break if data == 0
    sum += data
end

puts total - sum

レシート

問題

太郎君は10冊の本を購入した．
後日，
レシートをもとに価格を調べようとしたが，
レシートには汚れがあり，
ある本の価格が読み取れなかった．
その本の価格を，
10冊の総額と他の9冊の価格から計算することにした．

価格が読み取れなかった本の価格を出力するプログラムを書け．
なお，本の価格はすべて正の整数である．
また，消費税を考慮する必要はない．

入力

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

各データセットは10行からなり，1行に1つずつ正の整数が書かれている．
1行目の整数は10冊の総額を，
2行目から10行目の整数は読み取れた価格を表している．
なお，10冊の総額は10000以下である．

総額 が 0 のとき入力の終了を示す.データセットの数は 5 を超えない．

出力

データセットごとに，価格が読み取れなかった本の価格を1 行に出力する．

入出力例

入力例

9850
1050
800
420
380
600
820
2400
1800
980
0

出力例

600

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


def calc(a, b, c)
  (a+b+c+1)/2
end

n, m, k = gets.split.map(&:to_i)
l1 = Array.new(n){ [0]*n }
l2 = Array.new(n){ [] }
l3 = []
m.times do
  a, b, c = gets.split.map(&:to_i)
  a -= 1; b -= 1
  l1[a][b] = l1[b][a] = c
  l2[a] << b; l2[b] << a
  l3 << [a,b,c]
end

visited = [false]*n
arr = []
dist = [1<<31]*n
k.times do
  visited[i = gets.to_i - 1] = true
  arr << i
  dist[i] = 0
end

until arr.empty?
  s = arr.min{ |a,b| dist[a] <=> dist[b] }
  arr.delete s
  l2[s].each do |t|
    d = dist[s] + l1[s][t]
    if (old = dist[t]) > d
      dist[t] = d
      arr << t if old == 1 << 31
    end
  end
end
ret = 0
m.times{ |i| ret = [ret, calc(dist[l3[i][0]], dist[l3[i][1]], l3[i][2])].max }
p ret

JOI 国の買い物事情(Shopping in JOI Kingdom)

JOI 国にはN 個の町があり，それらの間はM 本の双方向に通行可能な道路で結ばれている．K 個の町にはショッピングモールがあり，国民は道路を通ってそれらの町のいずれかに行き買い物をする．

家の場所によっては，買い物に行くために長い距離を移動する必要があり，それは非常に不便である．国王はこの実情を把握するため，ショッピングモールのある町までの最短距離が家の場所によってどれだけ長くなりうるのかを調べることにした．家は道路の途中に建てられることもあるので(入力例1 の説明を参照)，この調査は非常に大変である．そこで国王は，優秀なプログラマーであるあなたに，調査を行うプログラムの作成を依頼した．

課題

道路の情報とショッピングモールのある町の情報が与えられるとき，ショッピングモールのある町からもっとも遠い道路上の点(端点も含む) までの距離を求めるプログラムを作成せよ．町の中を移動するのにかかる距離は無視してよい．

制限

2 ≤ N ≤ 3000     JOI 国の町の個数

1 ≤ M ≤ 100000 = 105     JOI 国の道路の本数

1 ≤ K ≤ N     ショッピングモールがある町の個数

1 ≤ li ≤ 1000     i 番目の道路の長さ

入力

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

1 行目には整数N, M, K が空白区切りで書かれている．N はJOI 国の町の個数を，M はJOI 国の道路の本数を，i>K はショッピングモールがある町の個数をそれぞれ表す．町には1, 2, ..., N の番号がつけられている．

続くM 行は道路の情報を表す．i + 1 行目(1 ≤ i ≤ M) には整数ai, bi, li (1 ≤ ai ≤ N, 1 ≤ bi ≤ N, 1 ≤ li ≤ 1000) が空白区切りで書かれている．これは，i 本目の道路が町ai と町bi を結んでおり，長さがli であることを表す．道路の両端が同じ町であることはない．また，任意の2 つの町p, q に対し，pとq を結ぶ道路は2 本以上存在しない．どの町からどの町へもいくつかの道路をたどって行くことができる．

続くK 行はショッピングモールの情報を表す．i+M+1 行目(1 ≤ i ≤ K) には1 つの整数si (1 ≤ si ≤ N)が書かれている．これは町si にショッピングモールがあることを表す．s1, ..., sK の中に同じ値が2
回以上現れることはない．

出力

標準出力に，ショッピングモールのある町までの最短距離の最大値の小数点以下を四捨五入した整数1
つを出力せよ．

採点基準

採点用データのうち，配点の40% 分については，K = 1 を満たす．

入出力の例

入力例1

3 3 1
1 2 1
2 3 1
3 1 1
1

出力例1

2

入力例1 は次のような町を表す．道路の長さはすべて1 である．ショッピングモールは町1 にしかない．

ショッピングモールのある町までもっとも遠い点は，町2 と町3 を結ぶ道路上の，町2 から距離0.5 の位置にある点であり，ショッピングモールのある町までの距離は1.5 である．よって，それを四捨五入した値である2 を出力する．

入力例2

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

出力例2

3

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


n=gets.to_i
a=[]
n.times{a.push(gets.to_i)}
a=a.sort[0..2]
res=[]
a.permutation(2){|num|res.push(num.join.to_i)}
p res.sort[2]

問題 3

　入力ファイルの１行目に正整数 n （n≧3）が書いてあり，
つづく n 行に異なる正整数 a1, ..., an が
１つずつ書いてある．
a1, ..., an から異なる２個を選んで作られる
順列を（数として見て）小さい順に並べたとき，
３番目に来るものを出力せよ．

　ただし，
例えば，a1 = 1，a4 = 11 のような場合も，
a1a4 と a4a1 は異なる順列とみなす．
また，
1≦ai≦10000 (i=1, ..., n) かつ 3≦n≦104 である．

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

入出力例

入力例１

3
2
7
5

出力例１

52

入力例２

4
17
888
1
71

出力例２

171

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


def prime?(n)
  (2 ... n).each do |i|
    return false if n % i == 0
    break if i * i > n
  end
  true
end

def solve(n, c)
  return (n == 1 ? 11 : "99"*n) if c < 0

  1.step(10**n, 2).map{|i|
    s = (("%0#{n}d"%i).reverse + c.to_s + "%0#{n}d"%i).to_i
    prime?(s) ? s : 0
  }.max
end

puts solve(*gets.split.map(&:to_i))

問題５

　Ｊ中学校の運動会で次のようなクラス対抗の競技を行なうことになった．
各クラスから生徒代表の男女 n ペア

     　　 (男子生徒 b1， 女子生徒 g1)， (男子生徒 b2， 女子生徒 g2)， … ， (男子生徒 bn， 女子生徒 gn)

を選び，
0 から 9 までの数字が書かれた旗を自由に選んでもらい
（それぞれの旗は十分な個数ある），
横一列に並んでもらう．
ただし，
ペアになっている男子生徒と女子生徒は同じ番号の旗を一人１つずつ
選ばなければならず，
並び順は

     　　 b1 b2 … bn c gn … g2 g1

のように，
男子生徒達 n 人の並び順
b1 b2 … bn とは逆の順番
gn … g2 g1 で女子生徒達は
並ばなければならない．
中央の c には，
クラス担任の先生があらかじめ審判長によって指定された
番号の付いた旗を持って立つ場合と，
立たないことを審判長に指定される場合とがある．

　こうして並んだ生徒達（と先生）が持った旗の番号
を 2n 桁（または 2n+1 桁）の整数と考えたとき，
それが素数である方が勝ちである．
ただし，
両クラスとも素数だった場合あるいは両クラスとも素数でなかった場合には，
数が大きい方が勝ちである． また，

      0 b2 … bn c gn … g2 0
　あるいは
0 b2 … bn gn … g2 0

のように先頭に 0 が来るものは，
普通使われる数の表し方ではないので禁止されている．

　Ｊ中学校の生徒であるあなたは，
自分のクラスが勝つためにはどのように並ぶのがよいかを
考えなければならない．

　入力ファイルの１行目に正整数 n と
１桁の整数 c（先生が持つ旗の番号）が
１つの半角空白文字で区切られて書かれている．
c<0 のときは，
先生が中央に立たないことを表わす．

与えられる入力は 1≦n≦10 である．

　負けない並び方の順番

     b1 b2 … bn c gn … g2 g1
　または
b1 b2 … bn gn … g2 g1

を出力せよ．

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

入出力例

入力例１

1 0

出力例１

101

入力例２

1 5

出力例２

757

入力例３

3 7

出力例３

9957599

入力例４

1 -1

出力例４

11

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


class Stack
  def initialize
    @sz = 0
    @elem = []
  end

  def push obj
    @elem << obj
    @sz += 1
  end

  # returns obj or nil if the stack is empty
  def pop
    obj = @elem.last
    @sz -= 1 if @sz > 0
    @elem = @elem[0..-2]
    obj
  end

  def peak
    obj = @elem.last
    obj
  end

  def empty?
    @sz == 0
  end
end

def main
  while num = gets
    num = num.chomp.to_i
    break if num == 0
    arr = gets.chomp.split(/\s/).collect { |x| x.to_i}
    stack = Stack.new
    stack.push arr[0]
    (1..arr.size - 1).each do |i|
      if stack.empty?
        stack.push arr[i]
      else
        elem = stack.peak
        if arr[i] == elem
          stack.push arr[i]
        else
          stack.pop
        end
      end
    end

    if stack.empty?
      puts "NO COLOR"
    else
      puts stack.peak
    end
  end
end

main

What Color Is The Universe?

On a clear night, a boy, Campanella looked up at the sky, there were many stars which have different colors such as red, yellow, green, blue, purple, etc. He was watching the stars and just lost track of time. Presently, he wondered,

"There are many stars in the space. What color is the universe if I look up it from outside?"

Until he found the answer to this question, he couldn't sleep. After a moment's thought, he proposed a hypothesis,

"When I observe the stars in the sky, if more than half of the stars have the same color, that is the color of the universe."

He has collected data of stars in the universe after consistently observing them. However, when he try to count the number of star, he was in bed sick with a cold. You decided to help him by developing a program to identify the color of the universe.

You are given an array A. Let |A| be the number of element in A, and let Nm be the number of m in A. For example, if A = {3, 1, 2, 3, 3, 1, 5, 3}, |A| = 8, N3 = 4, N1 = 2, N5 = 1. Your program have to find m such that:

Nm > (|A| / 2 )

If there is no such m, you also have to report the fact. There is no
such m for the above example, but for a array A = {5, 2, 5, 3, 4, 5, 5}, 5 is the answer.

Input

There are several test cases. For each test case, in the first line |A| is given. In the next line, there will be |A| integers. The integers are less than 231 and |A| < 1,000,000. The input terminate with a line which contains single 0.

Output

For each test case, output m in a line. If there is no answer, output "NO COLOR" in a line.

Sample Input

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

Output for the Sample Input

NO COLOR
5


until (n = gets.to_i).zero?
  dp = Array.new(n / 2 + 1){0}
  dp[1] = 1
  (2 .. n / 2).each do |i| dp[i] = 3 * dp[i - 1] + 1 end

  result = n
  (1 ... n / 2).each do |i|
    result += 4 * dp[i]
  end
  result += 2 * dp[n / 2] if n.odd?
  p result
end

Problem C: Finding the Largest Carbon Compound Given Its Longest Chain

An bydrocarbon is an organic compound which contains only carbons and hydrogens. An isomer is a compound that has the same number of carbons but different structures. Heptane, for example, is a hydrocarbon with 7 carbons. It has nine isomers. The structural formula of three are shown in Figure 1. Carbons are represented by the letter C, and bonds between carbons are represented by a straight line. In all figures, hydrogens are not represented for simplicity. Each carbon can be connected to a maximum of 4 carbons.

Figure 1: These three examples of isomers of heptane have the same number of carbons but different structures.

Let define a chain in an isomer as a sequence of connected carbons without branches. An isomer can have many chains of the same length. Figure 2 shows the longest chain of carbons for each of the represented isomer. Note that there can be many instances of longest chain in an isomer.

Figure 2: The figures shows one instance of longest chain of carbons in each isomer. The first and the second isomers show longest chains of 5 carbons. The longest chain in the third isomer has 4 carbons.

Your task is to identify the number of carbons of the largest possible carbon compound whose longest carbon chain has n (1 ≤ n ≤ 30) carbons.

Input

Each input contains a list of number of carbons, i.e. the length of a carbon chain.

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

Output

For each number n in input, identify the number of carbons of the largest possible carbon compound whose longest carbon chain has n carbons.

Sample Input

1
4

Output for the Sample Input

1
8


include Math

def inc(arr,x2,y2,r2)
	arr.each{|cir|
		x1,y1,r1 = cir
		d2 = ((x1-x2)**2 + (y1-y2)**2)
		if (((r1-r2)**2) >= d2 ) then
			if r1 < r2 then
				arr.delete(cir)
				arr.push([x2,y2,r2])
				return
			else
				return
			end
		end
	}
	arr.push([x2,y2,r2])
end

def calc(arr)
	ans = 0
	while(!arr.empty?) do
		cir1 = arr.pop
		x1,y1,r1 = cir1
		ans += r1 * 2 * PI
		arr.each{|cir2|
			x2,y2,r2 = cir2
			d2 = ((x1-x2)**2 + (y1-y2)**2)
			if ((r1 - r2) ** 2) < d2 and (d2 < ((r1 + r2) ** 2)) then
				d = sqrt(d2)
				r12 = r1**2
				r22 = r2**2
				theta1 = Math.acos((d2+r12-r22)/(2*d*r1))
				theta2 = Math.acos((d2-r12+r22)/(2*d*r2))
				ans -= (r1 * theta1 + r2 * theta2) * 2
			end
		}
	end
	return ans
end

loop do
	n = gets.to_i
	if (n == 0) then
		exit
	end

	arr = []
	sum = 0
	n.times{|i|
		x,y,r = gets.chomp.split.map(&:to_i)
		inc(arr,x,y,r)
	}

	p calc(arr)
end

Problem 07: Crop Circle

アルゼンチンの広大な農地に突如ミステリーサークルが出没した。ミステリーサークルは重なっているもの、ポツンとあるもの、大きいもの、小さいものと合計 n 個確認された。

あるミステリーハンターが空中からミステリーサークルの全体像を撮影しようと試みたところ、各円の輪郭がはっきりしていなかったため、映像にその美しい模様を映し出すことが難しいことが分かった。

そこで、そのミステリーハンターは輪郭に沿って特殊素材の紐を設置し、輪郭を強調する提案をした。

紐を設置する部分は、あるミステリーサークルの円周上で、他のどのミステリーサークルにも含まれない部分である。

撮影隊は必要な紐の長さを計測するために、プログラムの作成をあなたに依頼した。各ミステリーサークルの中心座標と半径を入力し、設置する紐の長さを報告するプログラムを作成せよ。

参考として入出力例の１つ目と２つ目のケースをそれぞれ図１、図２に示す。紐の部分が太い線で示されている。

図１

図２

Input

入力として複数のデータセットが与えられる。各データセットは以下の形式で与えられる：

n　（ミステリーサークルの数：整数）

x1 y1 r1 　（1 個目のサークルの中心座標と半径：空白区切りの実数）

x2 y2 r2 　（2 個目のサークルの中心座標と半径：空白区切りの実数）

.

.

xn yn rn 　（n 個目のサークルの中心座標と半径：空白区切りの実数）

n が 0 のとき、入力の終わりを示す。

Output

各データセットに対して、紐の長さを１行に出力せよ。出力は 0.000001 以下の誤差を含んでもよい。

Constraints

n ≤ 100

-1000 ≤ xi, yi ≤ 1000

0 < ri ≤ 100

Sample Input

4
6 4 2
4 7 3
7 10 3
13 6 1
4
7 4 2
4 7 3
7 10 3
11 6 3
0

Output for the Sample Input

39.664699289572
45.627024663706


loop{
	n,r = gets.split(nil)
	n = n.to_i()
	r = r.to_i()
	if ((n==0) and (r==0)) then
		break
	end

	arr = [*1..n]
	arr.reverse!

	for i in 1..r do
		p,c =gets.split.map(&:to_i)

		arr2 = arr[p-1..p+c-2]
		if (p == 1) then
			arr3 =[]
		else
			arr3 = arr[0..p-2]
		end

		arr = arr2+arr3+arr[p+c-1..n-1]

	end
	p arr[0]
}

Problem A: Hanafuda Shuffle

There are a number of ways to shuffle a deck of cards. Hanafuda
shuffling for Japanese card game 'Hanafuda' is one such example.
The following is how to perform Hanafuda shuffling.

There is a deck of n cards. Starting from the p-th card
from the top of the deck, c cards are pulled out
and put on the top of the deck, as shown in Figure 1.
This operation, called a cutting operation, is repeated.

Write a program that simulates Hanafuda shuffling and answers which
card will be finally placed on the top of the deck.

Figure 1: Cutting operation

Input

The input consists of multiple data sets.
Each data set starts with a line containing two positive integers n
(1 <= n <= 50) and r (1 <= r <= 50); n and
r are the number of cards in the deck and the number of cutting
operations, respectively.

There are r more lines in the data set, each of which
represents a cutting operation. These cutting operations
are performed in the listed order.
Each line contains two positive integers p and c
(p + c <= n + 1).
Starting from the p-th card from the top of the deck, c
cards should be pulled out and put on the top.

The end of the input is indicated by a line which contains two zeros.

Each input line contains exactly two integers separated by a space
character.
There are no other characters in the line.

Output

For each data set in the input, your program
should write the number of the top card after the shuffle.
Assume that at the beginning the cards
are numbered from 1 to n, from the bottom to the top.
Each number should be written in a separate line
without any superfluous characters such as leading or following spaces.

Sample Input

5 2
3 1
3 1
10 3
1 10
10 1
8 3
0 0

Output for the Sample Input

4
4


require 'set'

class Arrow
  attr_reader :source, :sink, :label

  def initialize(source, sink, label)
    @source = source
    @sink = sink
    @label = label
  end
end

def push(queue, key, value)
  size = queue.size
  index = queue.index{|target, _| target >= key} || size
  return queue[index][1] if index < size && queue[index][0] == key

  return nil if index > 0 && !key.start_with?(queue[index - 1][0])
  queue.slice!(index..-1) if index < size && !queue[index][0].start_with?(key)

  queue.insert(index, [key, value])
  value
end

def calc(n, arrows, start, goal)
  ins = Array.new(n){[]}
  arrows.each do |arrow|
    ins[arrow.sink] << arrow.source
  end

  reachable_from = {}
  stack = [goal]
  until stack.empty?
    node = stack.pop
    reachable_from[node] = true
    ins[node].each do |source|
      stack << source unless reachable_from[source]
    end
  end

  return nil unless reachable_from[start]
  arrows.select!{|arrow| reachable_from[arrow.sink]}

  outs = Array.new(n){[]}
  arrows.each do |arrow|
    outs[arrow.source] << arrow
  end

  max = n * arrows.map{|arrow| arrow.label.size}.max

  queue = [['', {start => true}]]
  until queue.empty?
    spell, map = queue.shift
    return spell if map[goal]

    return nil if spell.size > max

    map.each do |node, _|
      outs[node].each do |arrow|
        t = push(queue, spell + arrow.label, {})
        t[arrow.sink] = true if t
      end
    end
  end
  nil
end

loop do
  n, a, s, g = gets.split.map(&:to_i)
  break if n == 0

  arrows = (0...a).map do |i|
    x, y, lab = gets.split
    Arrow.new(x.to_i, y.to_i, lab)
  end

  puts calc(n, arrows, s, g) || 'NO'
end

Problem E: The Most Powerful Spell

Long long ago, there lived a wizard who invented a lot of "magical patterns."
In a room where one of his magical patterns is drawn on the floor,
anyone can use magic by casting magic spells!
The set of spells usable in the room depends on the drawn magical pattern.
Your task is to compute, for each given magical pattern,
the most powerful spell enabled by the pattern.

A spell is a string of lowercase letters.
Among the spells, lexicographically earlier one is more powerful.
Note that a string w is defined to be lexicographically earlier than a string u
when w has smaller letter
in the order a<b<...<z on the first position at which they differ,
or w is a prefix of u.
For instance, "abcd" is earlier than "abe" because 'c' < 'e',
and "abe" is earlier than "abef" because the former is a prefix of the latter.

A magical pattern is a diagram consisting of uniquely numbered nodes
and arrows connecting them.
Each arrow is associated with its label, a lowercase string.
There are two special nodes in a pattern, called the star node
and the gold node.
A spell becomes usable by a magical pattern if and only if the spell emerges
as a sequential concatenation of the labels of a path from the star to the gold along the arrows.

The next figure shows an example of a pattern with four nodes and
seven arrows.

The node 0 is the star node and 2 is the gold node.
One example of the spells that become usable by this magical pattern is "abracadabra",
because it appears in the path

0 --"abra"--> 1 --"cada"--> 3 --"bra"--> 2.

Another example is "oilcadabraketdadabra", obtained from the path

0 --"oil"--> 1 --"cada"--> 3 --"bra"--> 2 --"ket"--> 3 --"da"--> 3 --"da"--> 3 --"bra"--> 2.

The spell "abracadabra" is more powerful than "oilcadabraketdadabra"
because it is lexicographically earlier.
In fact, no other spell enabled by the magical pattern is more powerful than "abracadabra".
Thus "abracadabra" is the answer you have to compute.

When you cannot determine the most powerful spell, please answer "NO".
There are two such cases.
One is the case when no path exists from the star node to the gold node.
The other case is when for every usable spell there always exist more powerful spells.
The situation is exemplified in the following figure:
"ab" is more powerful than "b", and "aab" is more powerful than "ab", and so on.
For any spell, by prepending "a", we obtain a lexicographically earlier
(hence more powerful) spell.

Input

The input consists of at most 150 datasets.
Each dataset is formatted as follows.

n a s g

x1 y1 lab1

x2 y2 lab2

...

xa ya laba

The first line of a dataset contains four integers.
n is the number of the nodes, and a is the number of the arrows.
The numbers s and g indicate the star node and the gold node, respectively.
Then a lines describing the arrows follow.
Each line consists of two integers and one string.
The line "xi yi labi" represents
an arrow from the node xi to the node yi
with the associated label labi .
Values in the dataset satisfy:
2 ≤ n ≤ 40,
0 ≤ a ≤ 400,
0 ≤ s, g, xi , yi < n ,
s ≠g,
and
labi is a string of 1 to 6 lowercase letters.
Be careful that there may be self-connecting arrows (i.e., xi = yi ),
and multiple arrows connecting the same pair of nodes
(i.e., xi = xj and yi = yj
for some i ≠ j ).

The end of the input is indicated by a line containing four zeros.

Output

For each dataset, output a line containing the most powerful spell for the magical pattern.
If there does not exist such a spell, output "NO" (without quotes).
Each line should not have any other characters.

Sample Input

4 7 0 2
0 1 abra
0 1 oil
2 0 ket
1 3 cada
3 3 da
3 2 bra
2 3 ket
2 2 0 1
0 0 a
0 1 b
5 6 3 0
3 1 op
3 2 op
3 4 opq
1 0 st
2 0 qr
4 0 r
2 1 0 1
1 1 loooop
0 0 0 0

Output for the Sample Input

abracadabra
NO
opqr
NO


class Entry
  attr_reader :spell, :nodes

  def initialize(spell, nodes)
    @spell = spell
    @nodes = nodes
  end
end

class Arrow
  attr_reader :source, :sink, :label

  def initialize(source, sink, label)
    @source = source
    @sink = sink
    @label = label
  end
end

def push(queue, spell)
  size = queue.size
  index = queue.index{|entry| entry.spell >= spell} || size
  return queue[index].nodes if index < size && queue[index].spell == spell

  return nil if index > 0 && !spell.start_with?(queue[index - 1].spell)
  queue.slice!(index..-1) if index < size && !queue[index].spell.start_with?(spell)

  nodes = {}
  queue.insert(index, Entry.new(spell, nodes))
  nodes
end

def calc(n, arrows, start, goal)
  ins = Array.new(n){[]}
  arrows.each do |arrow|
    ins[arrow.sink] << arrow.source
  end

  reachable_from = {}
  stack = [goal]
  until stack.empty?
    node = stack.pop
    reachable_from[node] = true
    ins[node].each do |source|
      stack << source unless reachable_from[source]
    end
  end

  return nil unless reachable_from[start]
  arrows.select!{|arrow| reachable_from[arrow.sink]}

  outs = Array.new(n){[]}
  arrows.each do |arrow|
    outs[arrow.source] << arrow
  end

  limit = n * arrows.map{|arrow| arrow.label.size}.max

  queue = [Entry.new('', {start => true})]
  until queue.empty?
    entry = queue.shift
    spell = entry.spell
    nodes = entry.nodes
    return spell if nodes[goal]
    return nil if spell.size > limit

    nodes.each do |node, _|
      outs[node].each do |arrow|
        new_nodes = push(queue, spell + arrow.label)
        new_nodes[arrow.sink] = true if new_nodes
      end
    end
  end
  nil
end

loop do
  n, a, s, g = gets.split.map(&:to_i)
  break if n == 0

  arrows = (0...a).map do |i|
    x, y, lab = gets.split
    Arrow.new(x.to_i, y.to_i, lab)
  end

  puts calc(n, arrows, s, g) || 'NO'
end


#前計算をしておく
$hw_dict = []
def init_dict()
	for w in (1..151)
		for h in (1...w)
			elm = [h*h+w*w,h,w]
			$hw_dict.push(elm)
		end
	end
	$hw_dict = $hw_dict.sort()
end

def pred_pair(p1,p2)
	if p1[0] < p2[0]
		1
	elsif p1[0] > p2[0]
		-1
	else
		if p1[1] < p2[1]
			1
		elsif p1[1] > p2[1]
			-1
		else
			0
		end
	end
end

def solve(h,w)
	l = 0
	r = $hw_dict.length() - 1
	p = [h*h+w*w,h,w]
	ansp = 0
	found = 0
	while r - l > 1
		m = (l + r) / 2
		if pred_pair(p,$hw_dict[m]) > 0
			r = m
		elsif pred_pair(p,$hw_dict[m]) < 0
			l = m
		else
			ansp = m + 1
			found = 1
			break
		end
	end
	if found == 0
		ansp = r
	end
	[$hw_dict[ansp][1],$hw_dict[ansp][2]]
end

init_dict()
for i in (0..10)
	p $hw_dict[i]
end

while nums = STDIN.gets().chomp().split(" ")
	if nums[0].to_i() == 0 && nums[1].to_i() == 0
		exit
	else
		ans = solve(nums[0].to_i(),nums[1].to_i())
		puts "#{ans[0]} #{ans[1]}"
	end
end

Integral Rectangles

Let us consider rectangles whose height, h, and
width, w, are both integers. We call such rectangles
integral rectangles. In this problem, we consider only wide
integral rectangles, i.e., those with w > h.

We define the following ordering of wide integral rectangles. Given
two wide integral rectangles,

The one shorter in its diagonal line is smaller, and

If the two have diagonal lines with the same length, the one shorter
in its height is smaller.

Given a wide integral rectangle, find the smallest wide integral
rectangle bigger than the given one.

Input

The entire input consists of multiple datasets. The number of
datasets is no more than 100. Each dataset describes a wide integral
rectangle by specifying its height and width, namely h
and w, separated by a space in a line, as follows.

h w

For each dataset, h and w (>h) are both
integers greater than 0 and no more than 100.

The end of the input is indicated by a line of two zeros separated by a space.

Output

For each dataset, print in a line two numbers describing the
height and width, namely h and w (> h), of the
smallest wide integral rectangle bigger than the one described in the
dataset. Put a space between the numbers. No other
characters are allowed in the output.

For any wide integral rectangle given in the input, the width and
height of the smallest wide integral rectangle bigger than the given
one are both known to be not greater than 150.

In addition, although
the ordering of wide integral rectangles uses the comparison of
lengths of diagonal lines, this comparison can be replaced with that
of squares (self-products) of lengths of diagonal lines, which can
avoid unnecessary troubles possibly caused by the use of floating-point
numbers.

Sample Input

1 2
1 3
2 3
1 4
2 4
5 6
1 8
4 7
98 100
99 100
0 0

Output for the Sample Input

1 3
2 3
1 4
2 4
3 4
1 8
4 7
2 8
3 140
89 109


def gcd(m, n)
	if m < n
		gcd(n, m)
	elsif n == 0
		m
	else
		gcd(n, m % n)
	end
end

def lcm(m, n)
	m * n / gcd(m, n)
end

class Array
    def ary_gcd
        inject{|l, x| gcd(l, x)}
    end
    def ary_lcm
        inject{|l, x| lcm(l, x)}
    end
end

class Poly < Hash
    def self.var
        x = self.new(0)
        x[1] = 1
        x
    end

    def degree
        self.keys.max || 0
    end

    def self.num(n)
        d = self.new(0)
        d[0] = n
        d
    end

    def normalize!
        each_key do |k|
            delete(k) if self[k] == 0
        end
        self
    end

    def +(other)
        sum = self.class.num(0)
        self.each {|k, c| sum[k] += c}
        other.each {|k, c| sum[k] += c}
        sum.normalize!
    end

    def -(other)
        diff = self.class.num(0)
        self.each {|k, c| diff[k] += c}
        other.each {|k, c| diff[k] -= c}
        diff.normalize!
    end

    def -@
        m = self * self.class.num(-1)
        m.normalize!
    end

    def *(other)
        prod = self.class.num(0)
        self.each do |k1, c1|
            other.each do |k2, c2|
                prod[k1 + k2] += c1 * c2
            end
        end
        prod.normalize!
    end

    def **(k)
        return Poly.num(1) if k == 0
        return self if k == 1
        self * self ** (k - 1)
    end

    def zero?
        self.empty? || (degree == 0 && self[0] == 0)
    end

    def to_integral
        l = values.map {|x| x.kind_of?(Rational) ? x.denominator : 1}.ary_lcm
        v = self * Poly.num(l)
        g = v.values.map(&:to_i).map(&:abs).ary_gcd
        v.each_key {|k| v[k] = (v[k] / g).to_i}
        if v[v.degree] < 0
            v.each_key {|k| v[k] *= -1}
        end
        v
    end

    def to_s
        x = to_integral
        a = x.keys.sort.reverse.map do |k|
            if k == 0
                x[k]
            else
                "#{x[k] == 1 ? '' : x[k]}x#{k==1 ? '' : ?^ + k.to_s}"
            end
        end
        a.join(?+).gsub("+-", ?-)
    end

end

def get_exp(s, i)
    if s[i] == ?-
        t, j = get_term(s, i+1)
        return nil unless t

        j += 1 if s[j] == ?+
        e, k = get_exp(s, j)
        if e
            return [-t + e, k] if e
        else
            return [-t, j]
        end
    end

    t, j = get_term(s, i)
    return nil unless t

    j += 1 if s[j] == ?+
    e, k = get_exp(s, j)
    if e
        return [t + e, k] if e
    else
        return [t, j]
    end
end

def get_term(s, i)
    f, j = get_factor(s, i)
    return nil unless f

    t, k = get_term(s, j)
    if t
        return [f * t, k]
    else
        return [f, j]
    end
end

def get_factor(s, i)
    pr, j = get_primary(s, i)
    return nil unless pr
    if s[j] == ?^
        d, k = get_number(s, j+1)
        return nil unless d
        return [pr**d, k]
    else
        return [pr, j]
    end
end

def get_primary(s, i)
    return [Poly::var, i+1] if s[i] == ?x
    v, j = get_number(s, i)
    return [Poly::num(v), j] if v
    return nil unless s[i] == ?(
    e, j = get_exp(s, i+1)
    return nil unless e && s[j] == ?)
    return [e, j+1]
end

def get_number(s, i)
    return nil unless s[i] =~ /\d/
    j = i
    j += 1 while s[j] =~ /\d/
    return [s[i..j-1].to_i, j]
end

require 'rational'
def poly_gcd(e1, e2)
    return poly_gcd(e2, e1) if e1.degree < e2.degree
    return e1 if e2.zero?

    until e1.zero? || e1.degree < e2.degree
        r = Rational(e1[e1.degree], e2[e2.degree])
        e1 -= e2 * Poly::num(r) * Poly::var ** (e1.degree - e2.degree)
    end

    poly_gcd(e2, e1)
end

loop do
    s = gets.chomp
    break if s == ?.
    e1, _ = get_exp(s, 0)
    s = gets.chomp
    e2, _ = get_exp(s, 0)
    puts poly_gcd(e1, e2)
end

Problem I: Common Polynomial

Math teacher Mr. Matsudaira is teaching expansion and factoring of polynomials to his students.
Last week he instructed the students to write two polynomials (with a single variable x), and
to report GCM (greatest common measure) of them as a homework, but he found it boring to
check their answers manually. So you are asked to write a program to check the answers.

Hereinafter, only those polynomials with integral coefficients, called integral polynomials, are
considered.

When two integral polynomials A and B are given, an integral polynomial C is a common factor
of A and B if there are some integral polynomials X and Y such that A = CX and B = CY.

GCM of two integral polynomials is a common factor which has the highest degree (for x, here);
you have to write a program which calculates the GCM of two polynomials.

It is known that GCM of given two polynomials is unique when constant multiplication factor is
ignored. That is, when C and D are both GCM of some two polynomials A and B, p × C = q × D
for some nonzero integers p and q.

Input

The input consists of multiple datasets. Each dataset constitutes a pair of input lines, each
representing a polynomial as an expression defined below.

A primary is a variable x, a sequence of digits 0 - 9, or an expression enclosed within ( ... ). Examples:
x, 99, (x+1)

A factor is a primary by itself or a primary followed by an exponent. An exponent consists
of a symbol ^ followed by a sequence of digits 0 - 9. Examples:
x^05, 1^15, (x+1)^3

A term consists of one or more adjoining factors. Examples:
4x, (x+1)(x-2), 3(x+1)^2

An expression is one or more terms connected by either + or -. Additionally, the first
term of an expression may optionally be preceded with a minus sign -. Examples:
-x+1, 3(x+1)^2-x(x-1)^2

Integer constants, exponents, multiplications (adjoining), additions (+) and subtractions/negations
(-) have their ordinary meanings. A sequence of digits is always interpreted as an integer con-
stant. For example, 99 means 99, not 9 × 9.

Any subexpressions of the input, when fully expanded normalized, have coefficients less than
100 and degrees of x less than 10. Digit sequences in exponents represent non-zero values.

All the datasets are designed so that a standard algorithm with 32-bit two’s complement integers
can solve the problem without overflows.

The end of the input is indicated by a line containing a period.

Output

For each of the dataset, output GCM polynomial expression in a line, in the format below.

c0x^p0 ± c1x^p1 ... ± cnx^pn

Where ci and pi (i = 0, . . . , n) are positive integers with p0 > p1 > . . . > pn, and the greatest
common divisor of {ci | i = 0, . . . , n} is 1.

Additionally:

When ci is equal to 1, it should be omitted unless corresponding pi is 0,

x^0 should be omitted as a whole, and

x^1 should be written as x.

Sample Input

-(x^3-3x^2+3x-1)
(x-1)^2
x^2+10x+25
x^2+6x+5
x^3+1
x-1
.

Output for the Sample Input

x^2-2x+1
x+5
1