mountains = Array.new(10)
10.times do |i|
  mountains[i] = gets.to_i
end
mountains.sort!
9.downto(7) do |i|
  puts mountains[i]
end

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.


heights = []

10.times do |i|
  heights << gets.chomp.to_i
end

puts heights.sort.reverse[0, 3]


gets.to_i.times do
  edges = gets.split(" ").map{|x| x.to_i}
  puts 3.times.map {x, y, z = edges; x+y > z}.count(true) == 3 ? "YES" : "NO"
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


require 'matrix'

while input = gets do
  a, b, c, d, e, f = input.split(" ").map(&:to_f)
  m = Matrix[[a, b], [d, e]]
  v = Vector[c, f]
  puts (m.inv * v).map{ |x| x.round(3) }.to_s.gsub(/[[a-z][A-Z]\[\]\,]/, "")
end

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


testCase = Array.new
i = 0
STDIN.each_line do |line|
  testCase[i], testCase[i+1] = line.split(" ").map(&:to_i)
  i += 2
end
i = 0
testCase.length/2.times do
  print testCase[i].gcd(testCase[i+1])
  print " "
  puts testCase[i].lcm(testCase[i+1])
  i += 2
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


n = gets.to_i
ans = 100
n.times{
  ans = (ans*1.05).ceil
}
puts ans * 1000

Debt Hell

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

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

Input

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

Output

Print the amout of the debt in a line.

Sample Input

5

Output for the Sample Input

130000


while line = gets
  list = (2..line.to_i).to_a
  count = 0
  while not list.empty?
    count += 1
    new_list = []
    list.each do |n|
      new_list << n unless n % list.first == 0
    end
    list = new_list
  end
  puts count
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


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

Circumscribed Circle of A Triangle.

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

Input

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

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

in a line. All the input are real numbers.

Output

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

Constraints

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

$ n \leq 20$

Sample Input

1
0.0 0.0 2.0 0.0 2.0 2.0

Output for the Sample Input

1.000 1.000 1.414


w = gets.chomp.to_i  # pos number(yoko)
n = gets.chomp.to_i  # bar number(tate)

pos = [*0..w]

1.upto(n){|i|
  from,to = gets.chomp.split(',').map{|x| x.to_i}
  kari = pos[to]
  pos[to] = pos[from]
  pos[from] = kari
}
puts pos.reject{|x|x==0}

Drawing Lots

Let's play Amidakuji.

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

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

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

Input

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

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

Output

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

The number which should be under the 2nd vertical line

:

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

Sample Input

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

Output for the Sample Input

4
1
2
5
3


stack = []

while line = gets
  n = line.chomp.to_i

  if n == 0
    puts stack.pop
  else
    stack << n
  end
end

Switching Railroad Cars

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

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

An entry of a car is represented by its number.

An exit of a car is represented by 0

For example, a sequence

1
6
0
8
10

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

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

Input

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

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

Output

For each 0, print the car number.

Sample Input

1
6
0
8
10
0
0
0

Output for the Sample Input

6
10
8
1


while a=gets.to_i
	c=a.to_i
	b=0
	while c<600
		b+=c*c*a
		c+=a
	end
	puts b
end

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

Integral

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

$y = x^2$

$y = 0$

$x = 600$

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

$f(x) = x^2$

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

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

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

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

...

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

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

Input

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

Output

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

Sample Input

20
10

Output for the Sample Input

68440000
70210000


while a=c=gets.to_i
b=0
while c<600
b+=c*c*a
c+=a
end
puts b
end


# AOJ 0015 National Budget

class Bigint
  MAX_DIGIT = 80

  attr_reader :digit_num

  def initialize(s = "0")
    raise ArgumentError, "Non-numeric character exists" if /[^0-9]/ =~ s

    @digit = Array.new(MAX_DIGIT, 0)

    s = s.sub(/^0+/, "").reverse

    if s.empty?
      # 0 と等しい場合
      @digit_num = 1
    else
      # 0 より大きい場合
      @digit_num = s.length
      raise OverflowError, "Given integer is too big" if @digit_num > MAX_DIGIT

      s.each_char.with_index {|c, i| @digit[i] = c.to_i}
    end
  end

  def to_s
    @digit[0..(@digit_num - 1)].reverse.join("")
  end

  def to_i
    result = 0
    d = 1

    @digit[0..(@digit_num - 1)].each_with_index do |x, i|
      result += x * d
      d *= 10
    end

    result
  end

  def +(bi)
    raise TypeError unless bi.is_a?(Bigint)

    new_digit = @digit.dup
    new_digit_num = [@digit_num, bi.digit_num].max

    add = lambda {
      rec = lambda {|i, x|
        return if x.zero?

        raise OverflowError, "Sum is too big" unless i < MAX_DIGIT

        new_digit_num = i + 1 unless i < new_digit_num

        result = new_digit[i] + x
        new_digit[i] = result % 10

        # 桁上り
        rec[i + 1, 1] if result > 9
      }
    }.call

    bi.digit_num.times do |i|
      add[i, bi.digit[i]]
    end

    new2(new_digit_num, new_digit)
  end

  protected
  def digit
    @digit
  end

  def digit=(d)
    @digit = d
  end

  def digit_num=(n)
    @digit_num = n
  end

  private
  def new2(digit_num, digit)
    that = Bigint.new

    that.digit_num = digit_num
    that.digit = digit

    that
  end

  class OverflowError < Exception
  end
end

n = gets.to_i
n.times do
  begin
    x = gets.chomp
    y = gets.chomp
    puts(Bigint.new(x) + Bigint.new(y))
  rescue Bigint::OverflowError
    puts "overflow"
  end
end


while line = gets do
	26.times{
		if line.include?("the") || line.include?("this") || line.include?("that")
		  puts line
		  break
		end

		line.length.times{ |i|
			if "a" <= line[i] && line[i] < "z" then
				line[i] = line[i].next
			elsif line[i] == "z" then
				line[i] = "a"
			end
		}
	}
end

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.


table = ('a'..'z').to_a

while line = gets
  encoded = line.chomp.split('')
  for i in 0...table.size do
    decoded = ''
    for j in 0...encoded.size do
      index = table.index(encoded[j])
      if index
        decoded += table[(index + i) % (table.size)]
      else
        decoded += encoded[j]
      end
    end

    if decoded =~ /\b(the|this|that)\b/
      puts decoded
      break
    end
  end
end


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


while line = gets
  numbers = line.split().map{|i| i.to_i}
  puts numbers.sort().reverse().join(' ')
end


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.


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

Parallelism

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

Input

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

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

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

Output

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

Sample Input

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

Output for the Sample Input

YES
NO


require 'scanf'
require 'matrix'

dummy = STDIN.gets.to_i
for i in 0..dummy-1
    str = STDIN.gets
    x1,y1,x2,y2,x3,y3,x4,y4=\
        str.scanf("%f %f %f %f %f %f %f %f")
    v1=Vector[x2-x1,y2-y1].normalize
    v2=Vector[x4-x3,y4-y3].normalize
    eps=0.00001/(200.0*(2.0**0.5))
    if (v1.inner_product(v2).abs-1.0).abs < eps then
        print "YES\n"
    else
        print "NO\n"
    end
end


result = []

$stdin.gets.to_i.times{
  xa, ya, xb, yb, xc, yc, xd, yd = $stdin.gets.split.map(&:to_f)
  ab = (yb - ya)/(xb - xa)
  cd = (yd - yc)/(xd - xc)
  result << ((ab == cd) ? "YES" : "NO")
}

result.each{|r|
  puts r
}


while line = gets.chomp
  break if line == "0"
  ary = []
  max = -100001
  line.to_i.times do
    n = gets.to_i
    ary << 0
    ary.map!{|v| v + n}
    max_temp = ary.max
    max = max_temp if max_temp > max
  end
  puts max
end

Maximum Sum Sequence

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

Input

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

n
a1
a2
.
.
an

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

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

Output

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

Sample Input

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

Output for the Sample Input

19
14
1001


a = Array.new(100,0)
m = 0
while gets
  a[$_.to_i-1] += 1
  m = $_.to_i if m < $_.to_i
end
0.upto(m-1){|i|
  puts i+1 if a[i] == a.max
}

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.


English Sentence

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

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

Input

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

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

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

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

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

Output

The two words separated by a space.

Sample Input

Thank you for your mail and your lectures

Output for the Sample Input

your lectures


x = gets
y = x.split()

strlength= y.map{|str| str.length }

numlength = strlength.max

maxlengthin = strlength.find_index{|k| k == numlength}

strcount = []
i = 0
while i < y.length
 numcount = y.count{|a| y[i] == a}
 strcount << numcount
 i += 1
end

nummax = strcount.max

maxstr = strcount.find_index{|n| n == nummax}

puts "#{y[maxstr]} #{y[maxlengthin]}"


class Knapsack
	def initialize(items, budget)
		p @items = items.sort_by{|c, v| -v.to_f / c}
		@budget = budget

		@left_value = 0
		@left_cost = 0
		i = 0
		while i < @items.size
			c, v = @items[i]
			break if @left_cost + c > @budget
			@left_cost += c
			@left_value += v
			i += 1
		end

		@l = @r = i
		@states = []
		@lower_bound = @left_value
		@opt_cost = @left_cost
	end

	def solve
		return @left_value if @left_cost == @budget || @l == @items.size

		@states << [@left_cost, @left_value]
		@states << [@left_cost + @items[@l][0], @left_value + @items[@l][1]]

		loop {
			if @r < @items.size - 1
				@r += 1
				@states += @states.map{|c, v|
					[c + @items[@r][0], v + @items[@r][1]]
				}
			end

			if @l > 0
				@l -= 1
				@left_cost -= @items[@l][0]
				@left_value -= @items[@l][1]
				@states += @states.map{|c, v|
					[c - @items[@l][0], v - @items[@l][1]]
				}
			end

			prun
			update_lower_bound

			break if @l == 0 && @r == @items.size-1
		}

		return [@opt_cost, @lower_bound]
	end

private
	def upper_bound(cost, value)
		if cost <= @budget
			if @r == @items.size-1
				value
			else
				value + (@budget - cost).to_f * @items[@r+1][1] / @items[@r+1][0]
			end
		else
			if @l == 0
				value
			else
				value + (@budget - cost).to_f * @items[@l-1][1] / @items[@l-1][0]
			end
		end
	end

	def prun
		@states.reject!{|c, v|
			next true if c - @left_cost > @budget
			next true if upper_bound(c, v) <= @lower_bound
			false
		}
		hash = Hash.new(0)
		@states.each{|c, v|
			hash[c] = v if v > hash[c]
		}
		@states = hash.to_a
	end

	def update_lower_bound
		@states.each{|c, v|
			if c <= @budget && v > @lower_bound
				@lower_bound = v
				@opt_cost = c
			end
		}
	end
end

def knapsack(items, budget, mode = :normal)
	cost_group = items.group_by(&:first)
	items = cost_group.map{|c, group|
		group.sort_by(&:last).last(budget / c)
	}.inject([], &:+)

	case mode
	when :normal
		return _knapsack_normal(items, budget)
	when :core
		return _knapsack_core(items, budget)
	else
		raise "unknown mode"
	end
end

def _knapsack_normal(items, budget)
	table = (0..1).map{ Array.new(budget+1, 0) }
	for i in 0..items.size-1
		c, v = items[i]
		for j in 0..budget
			x = table[0][j]
			y = (j >= c ? table[0][j-c] + v : 0)
			table[1][j] = x > y ? x : y
		end
		table << table.shift
	end
	c = (1..budget).max_by{|i| table[0][i]}
	[c, table[0][c]]
end

def _knapsack_core(items, budget, mode = :normal)
	if mode == :drop_useless
		cost_group = items.group_by(&:first)
		items = cost_group.map{|c, group|
			group.sort_by(&:last).last(budget / c)
		}.inject([], &:+)
	end

	k = Knapsack.new(items, budget)
	k.solve
end

i = 1
loop {
	w = gets.to_i
	break if w == 0

	n = gets.to_i
	items = []
	n.times { items << gets.split(",").reverse.map(&:to_i) }

	c, v = knapsack(items, w, :normal)
	puts "Case #{i}:"
	puts v
	puts c
	i += 1
}

泥棒

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

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

Input

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

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

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

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

Output

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

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

Sample Input

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

Output for the Sample Input

Case 1:
220
49
Case 2:
220
49


require 'prime'

while n = gets do
	n = n.chomp.strip.to_i
	m, l = 0
	n.downto(3) {|i|
		if i.prime?
			m = i
			break
		end
	}
	n.upto(50000) {|i|
		if i.prime?
			l = i
			break
		end
	}
	puts m, l
end

素数 II

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

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

Input

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

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

Output

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

Sample Input

19
3517

Output for the Sample Input

17 23
3511 3527


type = {"A" => 0, "B" => 0, "AB" => 0, "O" => 0}
while (arg = gets)
  type[arg.chomp.split(",")[1]] += 1
end
type.each{|item|puts item[1]}

血液型

ある学級の生徒の出席番号と ABO 血液型を保存したデータを読み込んで、おのおのの血液型の人数を出力するプログラムを作成してください。なお、ABO 血液型には、A 型、B 型、AB 型、O 型の４種類の血液型があります。

Input

カンマで区切られた出席番号と血液型の組が、複数行に渡って与えられます。出席番号は 1 以上 50 以下の整数、血液型は文字列 "A", "B", "AB" または "O" のいずれかです。生徒の人数は 50 を超えません。

Output

１行目に A 型の人数

２行目に B 型の人数

３行目に AB 型の人数

４行目に O 型の人数

を出力します。

Sample Input

1,B
2,A
3,B
4,AB
5,B
6,O
7,A
8,O
9,AB
10,A
11,A
12,B
13,AB
14,A

Output for the Sample Input

5
4
3
2


class Sequence
  def initialize(start_num)
    @start_num = start_num
  end

  attr_accessor :start_num

  def num(idx)
    even_num = idx / 2
    odd_num = (idx - 1) / 2
    return @start_num * 2 ** even_num / (3 ** odd_num)
  end
end

while start_num = gets
  sum = 0.0
  seq = Sequence.new(start_num.to_f)
  (1..10).each do |n|
    sum += seq.num(n)
  end
  puts sum.round(7)
end

数列

次のように定義されている数列があります。

すべての偶数番目の項は一つ前の項に 2 を掛けたものと等しい数である。

すべての奇数番目の項は一つ前の項を 3 で割ったものと等しい数である。

この数列の初項 a を読み込み、初項から第 10 項までの和 s(10) を出力するプログラムを作成してください。

Input

入力は複数のテストケースからなります。各テストケースとして、数列の初項を表す実数 a (1.0 ≤ a ≤ 10.0) が１行に与えられます。

テストケースの数は 50 を超えません。

Output

テストケースごとに s(10) を１行に出力します。

出力は0.000001以下の誤差を含んでもよい。

Sample Input

1.0
2.0
3.0

Output for the Sample Input

7.81481481
15.62962963
23.44444444


while (line = gets)
  a = line.chomp.to_f

  s = a
  even = true

  (2..10).each do |i|
    if i % 2 == 0
      a *= 2
    else
      a /= 3
    end

    s += a
  end

  printf("%.8f\n", s)
end


c1, c2, c3 = gets.split.map(&:to_i)
cnt = 0
for i in 1..10 do
  unless i == c1 || i == c2 || i == c3 then
  	if c1 + c2 + i <= 20 then
  	  cnt += 1
    end
  end
end
if cnt >= 4 then
  puts "YES"
else
  puts "NO"
end

カードゲー ム

「1」から「10」までの数字が書かれたカードが各 1 枚、全部で 10 枚あります。このカードは、表側には数字が書かれ、裏側には何も書かれていません。このカードを使って、あなたと相手の 2 名で以下のルールでゲー ムを行います。

あなたと相手には、表を上にして 1 枚、裏を上にして 1 枚、計 2 枚のカードが配られています。あなたは相手の表のカードの数字を見ることができますが、裏のカードの数字は見えません。

配られたカードの数字の合計が 20 以下で、かつ相手の数字の合計より大きいときに勝ちとなります。
例えば、あなたのカードが「7」「8」 (合計 15) 、相手のカードが「9」「10」 (合計 19) のときは、相手の勝ちです。

あなたと相手は最大であと 1 枚カードを引くことができます。それを引かなくても構いません。

ここで、あと 1 枚のカードを引くかどうかを決定する目安として、カードを引いたときに合計が 20 以下に なる確率を考え、その確率が 50% 以上のときはカードを引くこととしましょう。この確率を計算するときには、あなたの 2 枚のカードと相手の表のカードの計3枚のカードの情報を利用することができます。つまり、各カードは 1 枚ずつしかないので、それらのカードを引くことはないことになります。

あなたの 2 枚のカードと相手の表のカードを読み込んで、それぞれについて、あと 1 枚引いたときに合計が 20 以下になる確率が 50% 以上のときは YES、そうでないなら NO を出力するプログラムを作成してください。

Input

入力は複数のデータセットからなります。 1 枚目のあなたのカードの数字を C1 、2 枚目のあなたのカードの数字を C2 、相手の表になっているカードの数字を C3 とすると、各データセットは以下の形式で与えられます。

C1 C2 C3

Output

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

Sample Input

1 2 3
5 6 9
8 9 10

Output for the Sample Input

YES
YES
NO


def CardGame( c1, c2, c3 )
	cards = Array.new
	1.upto( 10 ){ |n|
		cards << n
	}
	cards.delete( c1 )
	cards.delete( c2 )
	cards.delete( c3 )

	mynum = c1 + c2
	count = 0
	cards.each{ |n|
		if mynum + n <= 20
			count += 1
		end
	}

	#p count
	if count >= 4
		return "YES"
	else
		return "NO"
	end
end

answers = Array.new
while line = $stdin.gets
	nums = line.chomp.split( /\s/ ).map{ |i| i.to_i }
	answers << CardGame( nums[ 0 ], nums[ 1 ], nums[ 2 ] )
end
answers.each{ |a| puts a }


table = [[0, 1, 2], [3, 4, 5], [6, 7, 8], [0, 3, 6], [1, 4, 7], [2, 5, 8],
         [0, 4, 8], [2, 4, 6]]
check = ->(field, type) {
  table.each do |pat|
    return true if pat.map {|i| field[i] == type}.all?
  end
  false
}

$<.readlines.map(&:chomp).map(&:chars).each do |field|
  result = if check.(field, "o")
    "o"
  elsif check.(field, "x")
    "x"
  else
    "d"
  end
  puts result
end

三目並べ

三目並べは，３ × ３のマス目の中に交互に ○ と × を入れていき、縦・横・斜めの何れかに一列 ○ か × が並んだときに、勝ちとなるゲームです（図1〜図3 を参照）

図１：○の勝ち

図２：× の勝ち

図３：引き分け

三目並べは、○と×が交互にマス目を埋めていき、どちらかが一列揃ったときにゲーム終了となります。そのため、図 4 のように、○と×が両方とも一列そろっている場合はありえない局面です。ありえない局面が入力されることはありません。

図４：ありえない局面

三目並べの盤面を読み込んで、勝敗の結果を出力するプログラムを作成して下さい。

Input

入力は複数のデータセットからなります。各データセットとして、盤面を表す１つの文字列が１行に与えられます。
盤面の文字列は、○、×、空白をそれぞれ半角英小文字の o、x、s であらわし、下図のマス目の順に並んでいます。

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

Output

データセットごとに、○が勝ちなら半角英小文字の o を、×が勝ちなら半角英小文字の x を、引き分けならば半角英小文字の d を１行に出力してください。

Sample Input

ooosxssxs
xoosxsosx
ooxxxooxo

Output for the Sample Input

o
x
d


ビデオテープ

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


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

３乗根

$x^3 = q$ の解は漸化式 $x_{n+1} = x_n - \frac{x_{n}^3 - q}{3x_{n}^2}$ を計算していくことで近似的に求めることができます。

$x_1$ に正の数 $\frac{q}{2}$ をいれ

$x_2 = x_1 - \frac{x_{1}^3 - q}{3x_{1}^2}$、$x_3 = x_2 - \frac{x_{2}^3 - q}{3x_{2}^2}$、…　と計算します。

この計算をしながら、

$|x^3 - q|$ の値が、十分小さくなったところで、計算をやめ、最後に計算した $x_n$ を $x^3 = q$ の近似解とします。

この方法に従って、入力された正の整数 $q$ に対し、 $q$ の３乗根の近似値を出力するプログラムを作成してください。ただし、「十分小さくなった」という判定は $|x^3 - q| < 0.00001 q$ を用いてください。

入力

複数のデータセットが与えられる。各データセットに $q$ ($1 \leq q < 2^{31}$)（整数）が一行に与えられる。入力の終わりは -1 である。

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

出力

各データセットに対して $x$ （実数）を１行に出力する。出力結果に 0.00001 以下の誤差を含んでもよい。

Sample Input

15
15
-1

Output for the Sample Input

2.466212
2.466212


line = gets.chomp
ary = line.split(/[\s\.,]/)
ary2 = []
for i in ary
if i.size >= 3 && i.size <= 6
  ary2 << i
end
end
puts ary2.join(" ")

検索エンジン

インターネットの検索エンジン、例えば、Google などでは、世界中のウェブページを自動で収捨して分類し、巨大なデータベースを作成します。また、ユーザが入力した検索キーワードを解析して、データベース検索のための問い合わせ文を作成します。

いずれの場合も、効率的な検索を実現するために複雑な処理を行っていますが、とりあえずの基本は全て文章からの単語の切り出しです。

ということで、文章からの単語の切り出しに挑戦してください。今回は以下の通り、単語区切りが明確な英語の文章を対象とします。

対象となる文章　：　改行を含まない 1024 文字以下の英語の文章

区切り文字 ：　いずれも半角で空白、ピリオド、カンマのみ

切り出す単語　：　3 から 6 文字の単語（2文字以下や7文字以上の単語は無視）

入力

区切り文字及び英数字で構成される英文が１行（すべて半角）に与えられます。

出力

空白文字１文字（半角）で区切られた単語を１行に出力してください。

Sample Input

Rain, rain, go to Spain.

Output for the Sample Input

Rain rain Spain

Sample Input 2

Win today's preliminary contest and be qualified to visit University of Aizu.

Output for the Sample Input 2

Win and visit Aizu


def input_data_set
  data_count = gets.strip.to_i
  return data_sets if data_count.nil? || data_count.to_i == 0
  data_count.times.map{ gets.strip }
end

data_set = input_data_set
=begin
data_set = [
  "Hoshino",
  "Hashino",
  "Masayuki Hoshino was the grandson of Ieyasu Tokugawa.",
]
=end

data_set.each{ |s| puts s.gsub(/Hoshino/, "Hoshina") }

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.


until (n=gets.to_i)==0
  l1=gets.split.map(&:to_i)
  l2=Array.new(n)
  count=0
  loop do
    l1.each.with_index do |num,id|
      l2[id]=l1.count{|item| item==num}
    end
    break if l1==l2
    count+=1
    l1=l2.dup
  end
  puts "#{count}\n#{l1.join(" ")}"
end

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

出現頻度操作

有限数列の変換操作に出現頻度操作というものがあります。数列 $S = \{s_1, s_2,... s_n\}$ の変換結果は同じ長さの数列となります。その結果を $C = \{c_1,c_2, ..., c_n\}$ とすると、 $c_i$ は数列 $S$ における $s_i$ の個数を表します。

例えば $S = \{3,4,1,5,9,2,6,5,3\}$ ならば $C = {2,1,1,2,1,1,1,2,2}$ となります。さらにこの数列 $C$ に出現頻度操作を行うと $P = \{4,5,5,4,5,5,5,4,4\}$ を得ます。この数列は出現頻度操作で変わることがありません。このような数列 $P$ を数列 $S$ の不動点と呼びます。どのような数列に対しても出現頻度操作を繰り返せば、その不動点を求めることが出来るということが知られています。

下の例は出現頻度操作の手順を示したものです。1 行目を数列 $S$ 、2 行目を数列 $C$、最終行を数列 $P$ とします。数列 $S$ の最初の要素($s_1 = 2$) と同じ数は 3 個あるので数列 $C$ の最初の要素 $c_1$ は 3、次の要素 ($s_2 = 7$) と同じ数は 2 個あるので $c_2 = 2$、といった具合に個数を数え $c_i$ を求めていきます。

数列の長さ $n$ と数列 $S$ を入力し、不動点の数列 $P$ および、$P$ を得るために実行した出現頻度操作の最小の回数を出力するプログラムを作成してください。

Input

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

$n$

$s_1$ $s_2$ ... $s_n$

1 行目に数列の長さを表す整数 $n$ ($n \leq 12$) が与えられます。２行目に数列 $S$ の要素を表す整数　$s_i$ ($1 \leq s_i \leq 100$) が空白区切りで与えられます。

入力は０一つの行で終わります。データセットの数は 200 を超えません。

Output

各データセットについて、１行目に出現頻度操作の最小の実行回数(整数)、２行目に対応する不動点の数列 $P$ の要素 $p_1$, $p_2$, ..., $p_n$ を空白区切りで出力してください。

Sample Input

10
4 5 1 1 4 5 12 3 5 4
0

Output for the Sample Input

3
6 6 4 4 6 6 4 4 6 6


puts gets.strip.to_i.times.map {
  eval(gets.strip.gsub(/\.\d+/, "").sub(/=$/, ""))
}.join("\n")

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


n = gets.chomp.to_i

n.times.each do
  expr = gets.chomp.delete("=")

  ans = eval expr
  puts ans
end


日数

2 つの日付を入力とし、その 2 つの日付けの間の日数を出力するプログラムを作成してください。

日付 1 (y1, m1, d1) は日付 2 (y2, m2, d2) と同じか、あるいはそれ以前の日付とします。日付 1 は日数に含め、日付 2 は含めません。また、うるう年を考慮にいれて計算してください。うるう年の条件は次のとおりとします。

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

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

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

Input

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

y1 m1 d1 y2 m2 d2

y1, m1, d1, y2, m2, d2 のいずれかが負の数のとき入力の終わりとします。

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

Output

データセットごとに、日数を１行に出力してください。

Sample Input

2006 9 2 2006 9 3
2006 9 2 2006 11 11
2004 1 1 2005 1 1
2000 1 1 2006 1 1
2000 1 1 2101 1 1
-1 -1 -1 -1 -1 -1

Output for the Sample Input

1
70
366
2192
36890


require 'prime'

while (n = gets.to_i)!=0
	p Prime.each(n).each_cons(2).select {|a,b|
		b-a == 2
	}.max
end

Twin Prime

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

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

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

You may assume that 5 ≤ n ≤ 10000.

Input

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

n (integer)

Output

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

Sample Input

12
100
200
300
0

Output for the Sample Input

5 7
71 73
197 199
281 283


Grid

There is a n × n grid D where each cell contains either 1 or 0.

Your task is to create a program that takes the gird data as input and computes the greatest number of consecutive 1s in either vertical, horizontal, or diagonal direction.

For example, the consecutive 1s with greatest number in the figure below is circled by the dashed-line.

The size of the grid n is an integer where 2 ≤ n ≤ 255.

Input

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

n
D11 D12 ... D1n
D21 D22 ... D2n
.
.
Dn1 Dn2 ... Dnn

Output

For each dataset, print the greatest number of consecutive 1s.

Sample Input

5
00011
00101
01000
10101
00010
8
11000001
10110111
01100111
01111010
11111111
01011010
10100010
10000001
2
01
00
3
000
000
000
0

Output for the Sample Input

4
8
1
0


until (n = gets.chomp.to_i) == 0
  score_ary = []
  n.times do
    ary = gets.split.map(&:to_i)
    score_ary << ary.shift
    tmp_ary = []
    pin_ary = []
    tmp = 0
    ary.each_with_index do |item, index|
      tmp_ary << item
      if tmp_ary.size == 2 or tmp_ary[0] == 10
        pin_ary << tmp_ary
        tmp_ary = []
      end
      if pin_ary.size == 9
        tmp = index
        break
      end
    end
    pin_ary << ary.slice((tmp + 1)..(ary.size - 1))
    tmp_score = []
    pin_ary.each_with_index do |item, index|
      if index < 8
        if item[0] == 10
          if pin_ary[index + 1].size == 2
            tmp = 10 + pin_ary[index + 1][0] + pin_ary[index + 1][1]
          else
            tmp = 10 + pin_ary[index + 1][0] + pin_ary[index + 2][0]
          end
        elsif item[0] + item[1] == 10
          tmp = 10 + pin_ary[index + 1][0]
        else
          tmp = item[0] + item[1]
        end
      elsif index == 8
        if item[0] == 10
          tmp = 10 + pin_ary[index + 1][0] + pin_ary[index + 1][1]
        elsif item[0] + item[1] == 10
          tmp = 10 + pin_ary[index + 1][0]
        else
          tmp = item[0] + item[1]
        end
      else
        tmp = item.inject(:+)
      end
      tmp_score << tmp
    end
    score_ary << tmp_score.inject(:+)
  end
  Hash[*score_ary].sort_by {|k, v| k}.sort_by {|k, v| -v}.each {|item| puts item.join(" ")}
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


table = {"rg"=>"bb", "gr"=>"bb", "gb"=>"rr", "bg"=>"rr", "br"=>"gg", "rb"=>"gg"}

until (worm = $<.gets.chomp) == "0"
  queue = [worm]
  dist = {worm => 0}
  n = worm.size
  catch :jump do
    while (worm = queue.shift)
      goal = ["r" * n, "g" * n, "b" * n]
      if goal.include?(worm)
        puts dist[worm]
        throw :jump
      else
        (n - 1).times do |i|
          tmp = worm.dup
          pair = worm[i, 2]
          next unless table[pair]
          tmp[i, 2] = table[pair]
          next if dist[tmp]
          dist[tmp] = dist[worm] + 1
          queue << tmp
        end
      end
    end
    puts "NA"
  end
end

ふしぎな虫

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

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

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

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

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

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

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

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

Input

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

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

Output

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

Sample Input

rbgrg
rbbgbbr
bgr
bgrbrgbr
bggrgbgrr
gbrggrbggr
rrrrr
bgbr
0

Output for the Sample Input

5
7
1
6
NA
8
0
4


運送会社

白虎運送は会津若松市を代表する運送会社です。昨今の原油価格の高騰は運送会社にも多大なダメージを与え、運送会社各社では、できるだけ少ないガソリンで荷物を運ぶことが課題となっています。

白虎運送では、重い荷物を積んだトラックは、その走りだしに多くのエネルギーを必要とすることに着目しました。トラックが倉庫を出発してから一度も停止することなく目的地まで到達する経路の中で最短時間の経路を通ることで、ガソリンの節約ができると考えました。

あなたの仕事は、このような最短経路を計算できるカーナビを開発することです。作成するカーナビ用プログラムの仕様は以下のとおりです。

市内は、下図のように、東西方向の道路 M 本、南北方向の道路 N 本 からなる格子で表し、格子の各交点は交差点を表します。

交差点のいくつかには東西 - 南北の方向に信号機が設置されており、一定の周期で青、赤のシグナルが点灯しています。

市内の交差点間を結ぶ道路には工事中で通過できない個所がいくつかあります。

トラックが交差点から交差点へ移動するのに必要な時間は一定ですが、渋滞している道路ではさらに長い時間がかかります。

市内の道路情報、トラックが交差点間を移動するのに必要な時間、信号機がある交差点と各信号機の周期、工事中の道路、渋滞している道路と渋滞度、白虎運送の倉庫(始点)と目的地(終点)の位置を入力とし、始点から終点までの最短の時間を出力するプログラムを作成して下さい。

図のように、東西の方向の道路はa、b、c、... と英小文字で名前が付けられ 、南北の方向の道路は 1、2、3、... と整数で名前が付けられています。市内の交差点は、これらの英小文字と整数の組み合わせ H-V で指定されます。

例えば、市内の最北西の交差点は a-1 で指定されます。各信号は周期 k をもち、k 分ごとに切り替わります。東西が青ならば南北が赤で、南北が青ならば東西が赤です。黄色のシグナルは存在しません。トラックは二つの交差点を結ぶ道路を移動するのに D 分要しますが、その道路が渋滞している場合はさらに d 分の時間を要します。トラックは道路が工事中の場合は移動できません。

また、交差点に到達した時刻に、信号が赤の場合には進入できません。トラックは交差点でのみ、東、西、南、北に方向を変えることができますが、来た方向へは移動(Uターン)できません。道路は2方通行であり、トラックが行き来する時間、工事状況、渋滞度は2方向共通です。

初期状態として、トラックは東を向いていて、トラックが倉庫を出発する瞬間すべての信号機が南北の方向に青に切り替わるものとします。また、トラックは 100分以内で目的地に到達できるものとします。

Input

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

M N
D
ns
H1-V1 k1
H2-V2 k2
:
Hns-Vns kns
nc
H11-V11 H12-V12
H21-V21 H22-V22
:
Hnc1-Vnc1 Hnc2-Vnc2
nj
H11-V11 H12-V12 d1
H21-V21 H22-V22 d2
:
Hnj1-Vnj1 Hnj2-Vnj2 dnj
Hs-Vs Hd-Vd

１行目に道路の本数 M, N (2 ≤ M, N ≤ 20) が与えられます。２行目に、二つの交差点を結ぶ道路を移動するのに要する時間 D (1 ≤ D ≤ D, 整数) が与えられます。

３行目に信号機の数 ns が与えられます。続く ns 行に、i 個目の信号機の位置を表す英小文字と整数の組 Hi-Vi と周期 k (1 ≤ k ≤ 100) が与えられます。

続く行に、工事中の道路の数 nc が与えられます。続く nc 行に、i 個目の工事中の道路の２つの端点（交差点）を表す英小文字と整数の組 Hi1-Vi1 Hi2-Vi2 が与えられます。

続く行に、渋滞道路の数 nj が与えられます。続く nj 行に、i 個目の渋滞道路の２つの端点（交差点）を表す英小文字と整数の組 Hi1-Vi1 Hi2-Vi2 と時間 di (1 ≤ di ≤ 100) が与えられます。

最後の行に、始点の交差点 Hs-Vd と終点の交差点 Hd-Vd が与えられます。

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

Output

データセット毎に最短時間を１行に出力します。

Sample Input

4 5
1
3
b-2 3
c-3 2
c-4 1
3
a-2 b-2
b-3 c-3
d-3 d-4
2
b-3 b-4 1
c-1 d-1 1
d-1 b-4
4 5
1
3
b-2 3
c-3 2
c-4 1
3
a-2 b-2
b-3 c-3
d-3 d-4
2
b-3 b-4 1
c-1 d-1 1
d-2 b-4
4 5
1
3
b-2 3
c-3 2
c-4 1
3
a-2 b-2
b-3 c-3
d-3 d-4
2
b-3 b-4 1
c-1 d-1 1
d-3 b-4
0 0

Output for the Sample Input

7
4
8


Infinity = 1000000

def dijkstra graph, s
  #initialize
  n = graph.size
  dist = Array.new(n)
  n.times do |i|
    dist[i] = graph[s][i]
  end
  q = Array.new
  n.times do |u|
    q << [u, dist[u]]
  end

  while ! q.empty?
    #そこまでのコストが最も小さい節点を選択する
    q.sort!{|a, b| a[1] <=> b[1]}
    node = q.delete_at(0)
    u = node[0]
    w = node[1]
    #そこからコストが更新できる節点を更新する
    n.times do |v|
      next if graph[u][v] == Infinity
      newLength = w + graph[u][v]
      if newLength < dist[v]
        q << [v, newLength]
        dist[v] = newLength
      end
    end
  end
  dist
end

loop do
  #入力値で初期化
  n,m = $stdin.gets.chomp.split(" ").map(&:to_i)
  break if (n|m) == 0
  graphMoney = Array.new(m).map{Array.new(m, Infinity)}
  graphTime = Array.new(m).map{Array.new(m, Infinity)}
  m.times do |u|
    graphMoney[u][u] = 0
    graphTime[u][u] = 0
  end
  #線路情報からグラフ生成
  n.times do
    a,b,cost,time = $stdin.gets.chomp.split(" ").map(&:to_i)
    graphMoney[a - 1][b - 1] = cost
    graphMoney[b - 1][a - 1] = cost
    graphTime[a - 1][b - 1] = time
    graphTime[b - 1][a - 1] = time
  end

  $stdin.gets.to_i.times do
    p,q,r = $stdin.gets.chomp.split(" ").map(&:to_i)
    case r
    when 0
      p dijkstra(graphMoney, p - 1)[q - 1]
    when 1
      p dijkstra(graphTime, p - 1)[q - 1]
    end
  end
end

青春の片道切符

太郎君は夏休みに電車で長旅をする計画を立てています。しかし高校生の身である太郎君が一ヵ月しかない夏休みで可能な限り遠くに旅をするには、出来るだけ安い行き方と出来るだけ早い行き方をそれぞれ見つけなければうまく計画が立てられません。太郎君が素敵な旅を満喫できるように、太郎君の計画の助けになるプログラムを作ってあげましょう。

線路の情報、駅の数を入力とし、問い合わせに応じて、最小金額または最短時間を出力するプログラムを作成してください。

Input

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

n m
a1 b1 cost1 time1
a2 b2 cost2 time2
:
an bn costn timen
k
p1 q1 r1
p2 q2 r2
:
pk qk rk

1 行目に線路の情報の数 n (1 ≤ n ≤ 3000)と駅の数 m (1 ≤ m ≤ 100) が与えられます。

続く n 行に i 番目の路線の情報が与えられます。各路線の情報として、路線がつなぐ２つの駅の番号 ai, bi (1 ≤ ai, bi ≤ m)、料金 costi (1 ≤ costi ≤ 1000)、移動時間 timei (1 ≤ timei ≤ 1000) が与えられます。ただし、各駅は 1 から m まで順番に番号が付けられているものとします。
なお、ai と bi が線路でつながっていれば、ai から bi、 bi からai の両方の移動が同じ料金と時間で可能とします。

続く行に問い合わせの数 k (1 ≤ k ≤ 200) が与えられます。続く k 行に i 番目の問い合わせが与えられます。各問合わせとして、出発駅 pi 、到着駅 qi 、出力する値の種類 ri (0 または 1)が与えられます。なお、問い合わせには必ず経路があるものとします。

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

Output

データセットごとに、最小金額もしくは最短時間を１行に出力します。ri が 0 の時は最小金額を、 1 の時は最短時間を出力します。

Sample Input

6 5
1 2 200 10
1 4 400 15
1 3 250 25
2 4 100 10
4 5 150 20
3 5 300 20
2
1 5 0
1 5 1
0 0

Output for the Sample Input

450
35


loop do
    a = []
    a << gets.to_i
    break if a[0] == 0
    4.times { a << gets.to_i }
    case a.uniq.map{|i| 1 << i-1}.inject(:|)
    when 1, 2, 4, 7
        puts [3] * 5
    when 3
        puts a
    when 6
        puts a.map {|x| x - 1}
    when 5
        puts a.join.tr("31", "12").split("")
    end
end

じゃんけん

仲良し 5 人組でじゃんけんをすることになりました。じゃんけんとは、グー、チョキ、パーという 3つの手があり、グーとチョキの勝負ならグーが「勝ち」・チョキが「負け」、チョキとパーなら、チョキが「勝ち」・パーが「負け」、パーとグーならパーが「勝ち」・グーが「負け」というルールです。全員が同じ手、またはグー、チョキ、パー全てが出た場合は「あいこ」となります。

5 人のじゃんけんの手を入力とし、それぞれの人の勝敗を出力するプログラムを作成してください。じゃんけんの手は、グーは 1、チョキは 2、パーは 3 の数字で表します。勝敗は「勝ち」を 1、「負け」を 2、「あいこ」を 3 の数字で表し、入力順に従って出力します。

Input

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

h1
h2
h3
h4
h5

i 行目に i 人目の手 hi (1, 2 または 3) が与えられます。

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

Output

入力データセットごとに、5 人の勝敗を出力します。i 行目に i 人目の勝敗(1, 2 または 3) を出力してください。

Sample Input

1
2
3
2
1
1
2
2
2
1
0

Output for the Sample Input

3
3
3
3
3
1
2
2
2
1


### main

while true
  m, n = gets.strip.split(' ').map{|s| s.to_i}
  break if m == 0 && n == 0

  players = (0...m).map{|i| [i, i - 1, i + 1]}
  players[0][1] = m - 1
  players[m - 1][2] = 0

  num = 1
  pn = 0

  n.times.each do
    s = gets.strip
    next if m == 1

    div3 = (num % 3 == 0)
    div5 = (num % 5 == 0)
    expected =
      (div3 && div5) ? 'FizzBuzz' :
      div3 ? 'Fizz' :
      div5 ? 'Buzz' :
      num.to_s
    #p [pn, s, expected]

    prv_pn = players[pn][1]
    nxt_pn = players[pn][2]

    if s != expected
      players[prv_pn][2] = nxt_pn
      players[nxt_pn][1] = prv_pn

      players[pn] = nil
      m -= 1
    end

    pn = nxt_pn
    num += 1
  end

  rems = (0...m).select{|i| ! players[i].nil?}.map{|i| i + 1}
  puts rems.join(' ')
end

FizzBuzz

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

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

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

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

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

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

Input

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

m n
s1
s2
:
sn

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

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

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

Output

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

Sample Input

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

Output for the Sample Input

2 3 4 5
1


sum=0
10.times do
  sum+=gets.to_i
end
puts sum

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


n = gets.to_i
arr = gets.chomp.split.map(&:to_f).sort
max = 0
arr.each_cons(2){|d, c|
    arr2 = arr.dup
    arr2.delete d
    arr2.delete c
    v = (arr2[-1] + arr2[-2]) / (c - d)
    max = v if max < v
}
puts max

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

有理式最大化

N 個の異なる自然数が与えられる。その中から異なる４つを選んで、それらを $A$, $B$, $C$, $D$ としたとき、次の数式

$\frac{A + B}{C - D}$

の最大値を求めたい。

N 個の異なる自然数が与えられたとき、その中から異なる４つを選んで、上の数式の最大値を求めるプログラムを作成せよ。

Input

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

N
a1 a2 ... aN

１行目に自然数の個数 N (4 ≤ N ≤ 1000) が与えられる。２行目に各自然数の値 ai (1 ≤ ai ≤ 108) が与えられる。ただし、同じ自然数が重複して現れることはない（i ≠ j について ai ≠ aj)。

Output

与えられた N 個の自然数に対して、上の数式の最大値を実数で出力する。ただし、誤差がプラスマイナス 10-5 を超えてはならない。

Sample Input 1

10
1 2 3 4 5 6 7 8 9 10

Sample Output 1

19.00000

入力例１では、$A=9$, $B=10$, $C=2$, $D=1$ などの組み合わせで最大になる。

Sample Input 2

5
22 100 42 3 86

Sample Output 2

9.78947

入力例２では、$A=100$, $B=86$, $C=22$, $D=3$ などの組み合わせで最大になる。

Sample Input 3

6
15 21 36 10 34 5

Sample Output 3

18.00000

入力例３では、$A=21$, $B=15$, $C=36$, $D=34$ などの組み合わせで最大になる。

Sample Input 4

4
100000 99999 8 1

Sample Output 4

28571.285714


柴犬の数

イヅア公園には、夕方になると柴犬と散歩する人たちがたくさん来ます。柴犬には毛の色によって赤柴、黒柴、白柴、胡麻柴という種類があります。柴犬がたくさんいるとうれしいトモエちゃんは、それぞれの毛色の柴犬が何頭いるかがんばって数えましたが、まだ足し算ができないので柴犬が全部で何頭いるかわかりません。

それぞれの毛色の柴犬の数が与えられたときに、柴犬の総数を計算するプログラムを作成せよ。

入力

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

$R$ $B$ $W$ $G$

１行に赤柴の数$R$ ($1 \leq R \leq 100$)、黒柴の数$B$ ($1 \leq B \leq 100$)、白柴の数$W$ ($1 \leq W \leq 100$)、胡麻柴の数$G$ ($1 \leq G \leq 100$)が与えられる。

出力

柴犬の総数を１行に出力する。

入出力例

入力例１

4 2 1 1

出力例１

8

入力例２

22 18 34 36

出力例２

110


while line = gets do
	a, b = 0, 0							# 多項代入
	exit if line.to_i == 0	# 一行IF

	line.to_i.times do
		tmp_a, tmp_b = gets.split().map(&:to_i)

		if tmp_a > tmp_b
			a += tmp_a + tmp_b
		elsif tmp_a < tmp_b
			b += tmp_a + tmp_b
		else
			a += tmp_a
			b += tmp_b
		end
	end
	puts "#{a} #{b}"
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の得点の後）に改行を入れること。

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


words = Array.new

N = gets.to_i
input = Array.new(N){0}
output = Array.new(N){0}
N.times do |i|
n1,n2 = gets.split.map(&:to_s)
input[i]=n1
output[i]=n2
end

M = gets.to_i

M.times do
	word = gets.chomp.to_s
	ans = word
	N.times do |i|
		if(input[i]===word)
			ans = output[i]
			break
		end
	end
	words.push(ans)
end

M.times do
	w = words.shift
print(w)
end

与えられた変換表にもとづき，データを変換するプログラムを作成しなさい．

データに使われている文字は英字か数字で，英字は大文字と小文字を区別する．変換表に現れる文字の順序に規則性はない．

変換表は空白をはさんで前と後ろの 2 つの文字がある(文字列ではない)．変換方法は，変換表のある行の前の文字がデータに現れたら，そのたびにその文字を後ろの文字に変換し出力する．変換は 1 度だけで，変換した文字がまた変換対象の文字になっても変換しない．変換表に現れない文字は変換せず，そのまま出力する．

入力ファイルには，変換表（最初の n + 1 行）に続き変換するデータ（n + 2 行目以降）が書いてある． 1 行目に変換表の行数 n，続く n 行の各行は，空白をはさんで 2 つの文字，さらに続けて， n + 2 行目に変換するデータの行数 m，続く m 行の各行は 1 文字である． m ≤ 105 とする．出力は，出力例のように途中に空白や改行は入れず 1 行とせよ．

入力例

3

A a

0 5

5 4

10

A

B

C

0

1

4

5

a

b

A

出力例

aBC5144aba

入力

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

出力

データセットごとに、変換後の文字列を１行に出力する．

入力例

3
A a
0 5
5 4
10
A
B
C
0
1
4
5
a
b
A
3
A a
0 5
5 4
10
A
B
C
0
1
4
5
a
b
A
0

出力例

aBC5144aba
aBC5144aba

各データセットの出力（変換後の文字列）の後に改行を入れること．

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


while true
  n,r = gets.split(" ").map{|s| s.to_i}
  break if (n==0 && r==0)

  a = Array.new(n){gets.split(" ").map{|s| s.to_i}}

  f = Array.new(100){|y| Array.new(100){|x|
      for i in 0..n-1
        x1,y1,x2,y2 = a[i]
        inc = (y1<=y && y<y2 && x1<=x && x<x2)
        break if inc
      end
      inc ? 1 : 0
    }
  }

  puts f.map{|arr| (arr.to_s.split("0")-[""]).map{|str| str.size}}.inject(:+)
  puts f.size if r==2
end

平面に長方形のシートが何枚か置かれている. これらのシートで覆われている部分の面積や周長を求めるプログラムを作成せよ.

ただし, 平面を座標平面とみなしたとき, シートの配置は次の条件 (1), (2) を満たすものとする.

(1) 各シートの長方形の 4 頂点の x, y 座標は全て 0 以上 10000 以下の整数であり, 長方形の各辺は x 軸, または y 軸に平行である.

(2) シートの枚数は高々 10000 枚以下である.

入力データ の 1 行目に長方形の個数 n と問題の種類を表す整数 r が空白で区切って書かれている. 2 行目以降の各行には, 各シートの左下頂点座標 (x1, y1) と右上頂点座標 (x2, y2) の座標値が x1, y1, x2, y2 の順で空白で区切って書いてある.

出力には r = 1 のとき 1 行目に面積を, r = 2 のとき 1 行目に面積, 2 行目に周囲の長さを出力する. いずれの場合も最後に改行を入れること.

また, テストデータの 40% では長方形の頂点の座標が 0 以上 100 以下で, そのうちの 1/2 では面積だけを求める問題である. さらに, 全体の 1/2 は面積だけを求める問題である.

入力例１

入力例２

入力例３

入力例４

5 1

5 2

2 2

3 2

0 0 3 2

0 0 3 2

0 0 8 9

2 2 8 8

1 1 2 5

1 1 2 5

0 0 9 8

3 0 4 9

0 4 6 5

0 4 6 5

5 0 7 9

3 3 5 6

3 3 5 6

5 0 7 6

5 0 7 6

出力例１

出力例２

出力例３

出力例４

29

29

80

45

38

36

36

入力

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

出力

データセットごとに, r = 1 のとき 1 行目に面積を, r = 2 のとき 1 行目に面積, 2 行目に周囲の長さを出力する.

入力例

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

出力例

29
29
38
80
36
45
36

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


#!/usr/bin/ruby
# -*- coding: utf-8 -*-

attend = []
28.times {
  attend.push(gets.to_i)
}

1.upto(30) {|x|
  if !attend.include?(x)
    puts x
  end
}

未提出者は誰だ

問題

JOI大学のM教授はプログラミングの授業を担当している．クラスには30人の受講生がいて各受講生には1番から30番までの出席番号がふられている．この授業の課題を28人の学生が提出した．提出した28人の出席番号から提出していない2人の出席番号を求めるプログラムを作成せよ．

入力

入力は28行あり，各行には提出者の出席番号（1以上30以下）が1つずつ書かれている．入力される出席番号に重複はないが，どのような順に入力されるかはわからない．

出力

出力は2行からなる． 1行目に2人の未提出者の出席番号のうち小さいほうを， 2行目に大きいほうを出力せよ．

入出力例

入力例 1

3
1
4
5
7
9
6
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

出力例 1

2
8

入力例 2

9
30
6
12
10
20
21
11
7
5
28
4
18
29
17
19
27
13
16
26
14
23
22
15
3
1
24
25

出力例 2

2
8

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


require 'rational'

class AOJ0520
  def initialize(n)
    @n = n
    @poles = []
  end

  def solve
    @n.times{ @poles << gets.split.map(&:to_i) }

    top = ((1..@n).to_a - @poles.map{ |p| [p[2], p[3]] }.flatten)[0]

    weight(top-1)
  end

  def weight(id)
    r = (@poles[id][2] == 0 ? 1 : weight(@poles[id][2]-1))
    l = (@poles[id][3] == 0 ? 1 : weight(@poles[id][3]-1))

    p = @poles[id][0]
    q = @poles[id][1]

    a = (r*q).lcm(l*p) / q
    b = (r*q).lcm(l*p) / p

    a+b
  end
end

while (n = gets.chomp.to_i) != 0
  puts AOJ0520.new(n).solve
end

最軽量のモビール

問題

モビールは動く芸術品として広く親しまれている.IOI 日本委員会では,JOI を広報するためにモビールを作成することになった.JOI 広報用モビールは,棒,紐(ひも),錘(おもり)の 3 種類の要素を用いて,次のように構成される.

棒の一方の端は青に,もう一方の端は赤に塗られている.

棒は両端以外の 1 箇所を支点として紐でつるされる.

支点から赤の端までの長さも支点から青の端までの長さも正整数である.

棒の両端には,紐で錘か他の棒をつるす.

錘は紐を用いてどれかの棒の一端につるされる.

錘には何もつるさない.

錘の重さは正整数である.

紐のうち 1 本だけは,片方の端をある棒をつるすためにその棒の支点に結ばれ,
もう一方の端は他のどの構成要素とも結ばれていない.他の紐は全て次のいず
れかを満たす.

ある棒の端とある棒の支点を結ぶ.

ある棒の端とある錘を結ぶ.

ただし,どの棒においても,バランスが取れている必要がある.棒と紐の重さは無視できるほど軽いので,棒と紐の重さは全て 0 であるとみなして解答せよ.つまり,それぞれの棒について,

(その棒の赤の端より下につるされている錘の重さの総計)
× (その棒の支点から赤の端までの長さ)
= (その棒の青の端より下につるされている錘の重さの総計)
× (その棒の支点から青の端までの長さ)

であるとき,その棒はバランスが取れているとせよ.

どのような長さの棒をどのように結びモビールを構成するかは既に決まっているのだが,錘の重さがまだ決まっていない.モビールは軽い方がつりやすいため, なるべく軽いモビールを作りたい.前述したようにどの棒もバランスを取りながら, モビールの総重量を最小にするような錘の付け方を求め, そのときのモビールの総重量を出力するプログラムを作れ. プログラムには以下のモビールの構成に関する情報が与えられる.

棒の本数 n

各棒ごとの情報(棒の番号は 1 から n)

支点から赤の端までの長さと支点から青の端までの長さの比

赤の端につるす棒の番号 (錘をつるす場合は 0)

青の端につるす棒の番号 (錘をつるす場合は 0)

入力

入力は複数のデータセットからなる．各データセットは以下の形式で与えられる．入力はゼロ１つを含む行で終了する．

1 行目にはモビールに使われている棒の本数 n が書かれている.続く n 行 (1 ≤ n ≤ 100) には,各々の棒のデータが書かれている.i + 1 行目 (1 ≤ i ≤ n) には,4 つの整数 p, q, r, b が空白を区切りとして書かれており,棒 i において,支点から赤の端までの長さと支点から青の端までの比が p : q であり,赤の端につるされる棒の番号が r であり,青の端につるされる棒の番号が b であることを表している.ただし,棒番号 0 は錘がつるされることを表している.また,どの入力においても,モビールの重量の最小値を w とし,入力中で比を表すのに用いられる正整数の最大値を L とすると,wL < 231 を満たす.

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

出力

データセットごとにモビールの重量を１行に出力する．

入出力例

入力例

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

出力例

5
40

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


while true
  w, h = gets.split.map(&:to_i)
  break if w == 0
  xh = {}; yh = {}
  xa = []; ya = []
  points = []
  gets.to_i.times do
    point = gets.split.map(&:to_i)
    points << point
    xa << point[0]; xa << point[2]
    ya << point[1]; ya << point[3]
  end
  xa.uniq!; xa.sort!; ya.uniq!; ya.sort!
  xs = xa.size; ys = ya.size
  xa.each_with_index{ |a, i| xh[a] = i }
  ya.each_with_index{ |b, i| yh[b] = i }
  fld = Array.new(ys){ Array.new(xs, true) }
  fld[ys-1].fill(false)
  fld.map{ |arr| arr[xs-1] = false }

  for point in points
    x1, y1, x2, y2 = point
    for a in (yh[y1]...yh[y2])
      for b in (xh[x1]...xh[x2])
        fld[a][b] = false
      end
    end
  end
  fld.each{|a| p a}
  ret = 0
  for y in (0...ys)
    for x in (0...xs)
      next unless fld[y][x]
      arr = []
      arr << [y, x]
      until arr.empty?
        ny, nx = arr.shift
        [[-1,0],[0,-1],[1,0],[0,1]].each do |dy, dx|
          px = nx+dx; py = ny+dy
          if 0 <= px && px < xs && 0 <= py && py < ys && fld[py][px]
            arr << [py, px]
            fld[py][px] = false
          end
        end
      end
      ret += 1
    end
  end
  p ret
end

ペンキの色

問題

情報オリンピックの宣伝のために,長方形のベニヤ板にペンキを塗り看板を制作したい.ベニヤ板には色を塗りたくないところにあらかじめ何枚かの長方形のマスキングテープが貼られている.そこでマスキングテープで区切られた領域ごとに別々の色を使いペンキを塗ることにした.例えば,図 5-1 の場合は 5 色のペンキを使う.

入力としてマスキングテープを貼る位置が与えられた時,使うペンキの色の数を求めるプログラムを作成せよ.ただし,ベニヤ板全体がマスキングテープで覆われることはなく,全てのマスキングテープの辺はベニヤ板のいずれかの辺に平行である.

入力

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

1 行目にはベニヤ板の幅 w (1 ≤ w ≤ 1000000 となる整数) と高さ h (1 ≤ h ≤ 1000000 となる整数) がこの順に空白区切りで書かれている.

2 行目にはマスキングテープの数 n (1 ≤ n ≤ 1000 となる整数) が書かれている.
続く 3 行目以降の 2 + i 行目 (1 ≤ i ≤ n) には,i 番目に貼るマスキングテープの左下の座標 (x1 , y1 ) と,右上の座標 (x2 , y2 ) が x1 , y1 , x2 , y2 (0 ≤ x1 < x2 ≤ w, 0 ≤ y1 < y2 ≤ h となる整数) の順に空白区切りで書かれている.

ただし,ベニヤ板の左下の角の座標は (0, 0) で右上の角の座標は (w, h) である. 採点用データのうち, 配点の 30% 分は w ≤ 100, h ≤ 100, n ≤ 100 を満たす.

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

出力

データセットごとに使うペンキの色数を１行に出力する.

入出力例

次の例は図 5-1 の場合である.

入力例

15 6
10
1 4 5 6
2 1 4 5
1 0 5 1
6 1 7 5
7 5 9 6
7 0 9 2
9 1 10 5
11 0 14 1
12 1 13 5
11 5 14 6
0 0

出力例

5

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


@memory = {}
def count(size, max, sum)
  return @memory[[size, max, sum]] if @memory[[size, max, sum]]

  return @memory[[size, max, sum]] = 1 if size == 1

  max_max = [sum - size * (size - 1) / 2, max].min

  n = (size ** 2) - size + 2 * sum
  d = 2 * size
  max_min = n / d
  max_min += 1 if n % d > 0

  # return @memory[[size, max, sum]] = 1 if max_max == max_min

  if size == 2
    return @memory[[size, max, sum]] = max_max - max_min + 1
  end

  ans = 0
  # puts "size: #{size}, max_max: #{max_max} max_min: #{max_min}"
  (max_min..max_max).each do |max_size|
    ans += count(size - 1, max_size - 1, sum - max_size)
    ans %= 100000
  end

  @memory[[size, max, sum]] = ans
end

STDIN.each_line do |line|
  n, m, s = line.split(" ").map(&:to_i)
  break if n == 0 && m == 0 && s == 0
  puts count(n ** 2, m, s)
end

ビンゴ

問題

あるプログラミングコンテストでは,競技後の懇親会でビンゴゲームをする習わしがある．しかし,このビンゴゲームで使うビンゴカードは少々特殊で,以下の条件に従って作成される．

ビンゴカードは N 行 N 列のマス目に区切られており，各マス目には正整数が１つずつ書かれている．それらの整数は全て異なる．

マス目に書かれている整数は 1 以上 M 以下である．

ビンゴカードに書かれているN×N個の整数の合計は S である．

どの列を見たときも，上から下に向かって整数は昇順に並んでいる．

どのマス目の整数も，そのマス目より左の列のどの整数よりも大きい．

以下は， N = 5, M = 50, S = 685 のときのビンゴカードの例である．

懇親会のために上の条件を満たすビンゴカードをできるだけたくさん作りたい．ただし，同一のカードを2枚以上作ってはならない．作ることができるビンゴカードの枚数の最大値を 100000 で割った余りを出力するプログラムを作成せよ．

入力

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

入力は1行からなり, その行にはビンゴカードのサイズ N (1≤N≤7), マス目に書かれている整数の上限 M (1≤M≤2000),ビンゴカードに書かれている整数の合計 S (1≤S≤3000) を表す3つの正整数が空白区切りで書かれている．ただし, 与えられるどの入力データにおいても，条件を満たすビンゴカードを1枚以上作ることができる．

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

出力

データセットごとに, 作ることができるビンゴカードの枚数の最大値を 100000 で割った余りを1行に出力せよ．

入出力例

入力例

3 9 45
3 100 50
5 50 685
0 0 0

出力例

1
7
74501

3つ目の入力例に対して，作ることができるビンゴカードの枚数の最大値は 642499974501 であるので， 100000 で割った余りの 74501 を出力する．

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


while true
    n = gets.to_i
    m = gets.to_i
    break if [n, m] == [0, 0]
    h = Hash.new{|h, k| h[k] = []}
    m.times{
        a, b = gets.chomp.split.map(&:to_i)
        h[a] << b
        h[b] << a
    }
    friend = h[1].dup
    h[1].each{|x| h[x].each{|y| friend << y}}
    friend.delete(1)
    puts friend.uniq.length
end

パーティー

問題

あなたはクリスマスパーティーに学校内の自分の友達と，自分の友達の友達を招待することにした．
あなたの通う学校の生徒数は n 人であり，それぞれの生徒には 1 から n までの番号が割り振られている．
あなたの番号は 1 である．
あなたの手元には，誰と誰が友達であるかを記したリストがある．
このリストをもとに，
あなたがクリスマスパーティーに招待する生徒数を求めるプログラムを作成せよ．

入力

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

データセットの1 行目には学校の生徒数 n （2 ≤ n ≤ 500）が，
2 行目にはリストの長さ m （1 ≤ m ≤ 10000）が書かれている．
入力は全部で 2+m 行からなる．2+i 行目（1 ≤ i ≤ m）には 2 つの整数 ai と bi （1 ≤ ai < bi ≤ n）が空白区切りで書かれており，番号 ai と番号 bi の生徒が友達同士であることを表す．
3 行目から 2+m 行目には同じ友達関係を表す行が重複して現れることはない．

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

出力

データセットごとに，あなたがクリスマスパーティーに招待する生徒数を1 行に出力する．

入出力例

入力例

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

出力例

3
0

1つ目の入力例 において，あなたの友達は番号 2 と番号 3 の生徒の 2 人である．
また，番号 3 と番号 4 の生徒は友達同士であるので，
番号 4 の生徒はあなたの友達の友達である．
番号 5 と番号 6 の生徒はあなたの友達でもなく，あなたの友達の友達でもない．
したがって，あなたは番号 2,3,4 の 3 人の生徒をクリスマスパーティーに招待する．

2つ目の入力例 において，あなたには友達はいない．
したがって，あなたがクリスマスパーティーに招待する生徒数は 0 人である．

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


pasta = []
3.times do |i|
    pasta[i] = gets.to_i
end

juce = []
2.times do |i|
    juce[i] = gets.to_i
end

puts pasta.min + juce.min - 50

ランチ (Lunch)

問題

JOI パスタ店では，ランチのおすすめパスタと搾りたてジュースのセットメニューが好評である．このセットメニューを注文するときは，その日の 3 種類のパスタと 2 種類のジュースから 1 つずつ選ぶ．パスタとジュースの値段の合計から 50 円を引いた金額が代金となる．

ある日のパスタとジュースの値段が与えられたとき，その日のセットメニューの代金の最小値を求めるプログラムを作成せよ．

入力

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

1 行目の整数は 1 つ目のパスタの値段である．

2 行目の整数は 2 つ目のパスタの値段である．

3 行目の整数は 3 つ目のパスタの値段である．

4 行目の整数は 1 つ目のジュースの値段である．

5 行目の整数は 2 つ目のジュースの値段である．

ただし，与えられる入力データにおいては全てのパスタとジュースの値段は 100 円以上 2000 円以下であることが保証されている．

出力

その日のセットメニューの代金の最小値を 1 行で出力せよ．

入出力例

入力例 1

800
700
900
198
330

出力例 1

848

入出力例 1 では，2 つ目のパスタと 1 つ目のジュースを組み合わせた場合の
700 + 198 - 50 = 848 がその日のセットメニューの代金の最小値である．

入力例 2

1999
1999
100
189
100

出力例 2

150

入出力例 2 では，3 つ目のパスタと 2 つ目のジュースを組み合わせた場合の
100 + 100 - 50 = 150 がその日のセットメニューの代金の最小値である．

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


n, t, s = gets.split.map &:to_i
items = $<.map{|s| s.split.map &:to_i}

table1 = [ Array.new(s+1, 0) ]
for k in 1..items.size
	table1 << [0] * (s+1)
	v, c = items[k-1]
	for i in 0..s
		table1[k][i] = table1[k-1][i]
		if i >= c
			x = table1[k-1][i-c] + v
			table1[k][i] = x if x > table1[k][i]
		end
	end
end

max = table1[-1][s]

table2 = (0..1).map{ Array.new(t-s+1, 0) }
k.times {|j|
	v, c = items.pop
	for i in 0..t-s
		table2[1][i] = table2[0][i]
		if i >= c
			x = table2[0][i-c] + v
			table2[1][i] = x if x > table2[1][i]
		end
	end
	table1.pop
	sum = table1[-1][s] + table2[1][t-s]
	max = sum if sum > max
	table2 << table2.shift
}

p max

夜店(Night Market)

太郎くんは，JOI 神社で開かれる夏祭りに行くことにした．

JOI 神社に向かう道に沿って，N 個の夜店が開かれている．それぞれの夜店には，1 からN までの番号が順番についており，遊んだ時の楽しさと遊ぶのにかかる時間がそれぞれ整数で決まっている．夜店i で遊んだ時の楽しさはAi で，夜店i で遊ぶのにかかる時間はBi である．

また，夏祭りのイベントとして花火大会があり，時刻S に最も大きな花火が打ち上げられる．太郎くんはこの最も大きな花火を見たいと思っている．

太郎くんは夜店と花火の両方を楽しむために，夏祭りに到着する時刻0 から夏祭りが終わる時刻T までの予定を立てることにした．

太郎くんは夜店の中からk 個(1 ≤ k ≤ N) の夜店を選び，それぞれに対して訪れる時刻を整数で決める．同じ夜店を2 度選ぶことはできない．選ばれた夜店の番号を小さい順にy1, y2, ... yk とし，夜店yi を訪れる時刻をxyi とすると，太郎くんは夜店yi で時刻xyi から時刻xyi + Byi まで遊ぶ．

太郎くんは夜店の番号の小さい順に遊び，同時に2 つの夜店では遊べない．また，夜店と夜店の間の移
動にかかる時間は無視できる．

時刻T を超えると夏祭りが終わるので，夜店で遊ぶことはできない．また，夜店で遊んでいる間は花火を見ることはできない．ただし，時刻S がある夜店で遊び始める時刻や遊び終わる時刻であった場合は，太郎くんは花火を見ることができるものとする．

すなわち，予定は以下の条件を満たしていなければならない．

y1 < y2 < ... < yk

xy1, xy2, ... xyk は整数．

0 ≤ xy1 < xy1 + By1 ≤ xy2 < xy2 + By2 ≤ ... ≤ xyk < xyk + Byk ≤ T

xyi < S < xyi + Byi となるようなi は存在しない．

選ばれた夜店の楽しさAy1, Ay2, ... Ayk の合計をM とする．太郎くんはM ができるだけ大きくなるように予定を立てたいと思っている．

課題

N 個の夜店の情報と時刻S, T が与えられた時，M の最大値を求めるプログラムを作成せよ．

制限

1 ≤ N ≤ 3000     夜店の数

1 ≤ T ≤ 3000     夏祭りが終わる時刻

0 ≤ S ≤ T     最も大きな花火が打ち上げられる時刻

0 ≤ Ai ≤ 100000 (= 105)     夜店i で遊んだ時の楽しさ

1 ≤ Bi ≤ 3000     夜店i で遊ぶのにかかる時間

入力

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

入力の1 行目には整数N, T, S が空白を区切りとして書かれており，夜店の数がN 個，夏祭りが終わる時刻がT，最も大きな花火が打ち上げられる時刻がS であることを表す．

続くN 行には夜店の情報が書かれている．入力のi + 1 (1 ≤ i ≤ N) 行目には整数Ai, Bi が空白を区切りとして書かれており，夜店i で遊んだ時の楽しさがAi で，夜店i で遊ぶのにかかる時間がBi であることを表す．

また，すべての入力において，１つ以上の予定を立てられることが保証されている．

出力

標準出力に，M の最大値を表す整数を1 行で出力せよ．

採点基準

採点用データのうち，

配点の10%分については，N ≤ 20 を満たす．

配点の20%分については，S = 0 を満たす．

配点の30%分については，これら2 つの条件の少なくとも一方を満たす．また，これら2 つの条件の両方を満たすような採点用データはない．

入出力例

入力例 1

5 20 14
8 9
2 4
7 13
6 3
5 8

出力例 1

16

この例において，

夜店1 を時刻0 に訪れ，

夜店2 を時刻9 に訪れ，

夜店4 を時刻14 に訪れるような予定を立てると，M を最も大きくすることができる．

このとき，M = 8 + 2 + 6 = 16 である．

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


while p=gets
 a=p.chomp.to_i
 b=gets.chomp.to_i
 c=gets.chomp.to_i
 d=gets.chomp.to_i
 e=gets.chomp.to_i
 if b%d==0
  f=b/d
 else
  f=b/d+1
 end
 if c%e==0
  g=c/e
 else
  g=c/e+1
 end
 if f>=g
  h=f
 else
  h=g
 end
 i=a-h
 puts i.to_s
end

宿題 (Homework)

問題

冬休みの宿題に毎回苦しめられてきた JOI 君が，今回は宿題を計画的に実行することにした．宿題は国語と算数のドリルであり，国語のドリルは A ページ，算数のドリルは B ページある．

JOI 君は，1 日に国語のドリルを最大 C ページと，算数のドリルを最大 D ページ進めることができるが，宿題をするとその日は遊ぶことができない．

冬休みは L 日あり，JOI 君は冬休み中に宿題を終わらせなければならない．JOI 君が冬休み中に最大で何日遊べるかを求めるプログラムを作成せよ．

入力

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

1 行目には整数 L (2 ≦ L ≦ 40) が書かれており，冬休みの日数を表す．

2 行目には整数 A (1 ≦ A ≦ 1000) が書かれており，国語のドリルのページ数を表す．

3 行目には整数 B (1 ≦ B ≦ 1000) が書かれており，算数のドリルのページ数を表す．

4 行目には整数 C (1 ≦ C ≦ 100) が書かれており，JOI 君が 1 日に進めることができる国語のドリルの最大ページ数を表す．

5 行目には整数 D (1 ≦ D ≦ 100) が書かれており，JOI 君が 1 日に進めることができる算数のドリルの最大ページ数を表す．

ただし，与えられる入力データにおいては，JOI 君が冬休み中に宿題を必ず終わらせることができ，
少なくとも 1 日は遊べることが保証されている．

出力

JOI 君が冬休み中に遊べる日数の最大値を 1 行で出力せよ．

入出力例

入力例 1

20
25
30
6
8

出力例 1

15

入出力例 1 では，冬休みは 20 日間あり，国語のドリルが 25 ページ，算数のドリルが 30 ページある．JOI 君は 1 日に国語のドリルを最大 6 ページ，算数のドリルを最大 8 ページ進めることができる．例えば JOI 君が冬休み初日から国語のドリルを 6 ページ，算数のドリルを 8 ページずつ進めたとすると，国語のドリルを 5 日目に，算数のドリルを 4 日目に終わらせることができ，15 日間遊ぶことができる．これが JOI 君が冬休み中に遊べる日数の最大値なので，15 を出力する．

入力例 2

15
32
48
4
6

出力例 2

7

入出力例 2 では，
例えば JOI 君が初日から国語のドリルを 4 ページ，算数のドリルを 6 ページずつ進めたとすると，8 日目に両方のドリルを終わらせることができ，7 日間遊ぶことができる．これが JOI 君が冬休み中に遊べる日数の最大値なので，7 を出力する．

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


n, m, d = gets.split.map(&:to_i)
a = (1..n).map { gets.chomp }
f = -> a { a.map {|l| l.split(?#).map {|s| [s.size - d + 1, 0].max}}.flatten.inject(:+) }
c = f[a]
a = a.map {|l| l.split("")}.transpose.map(&:join)
p c + f[a]

休憩スペース (Refreshment Area)

問題

世界的なプログラミングコンテストが日本で開催されることになり，現在会場の設営が行われている．この会場は南北方向に N マス，東西方向に M マスのマス目状に区切られており，いくつかのマスには競技用の機材が置かれている．

このコンテストでは，選手が競技中に休憩するために，軽食や飲み物などを置いた休憩スペースを 1 箇所会場内に設けることになった．休憩スペースは南北方向または東西方向に連続した D マスでなければならない．ただし，機材の置かれたマス目に休憩スペースを設けることはできない．

会場内に休憩スペースを設ける方法は何通りあるかを求めるプログラムを作成せよ．

入力

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

1 行目には 3 個の整数 N, M, D (1 ≦ N ≦ 100, 1 ≦ M ≦ 100, 2 ≦ D ≦ 100) が空白を区切りとして書かれており，会場が南北方向に N マス，東西方向に M マスのマス目状に区切られており，休憩スペースが南北方向または東西方向に連続した D マスからなることを表す．

続く N 行にはそれぞれ M 文字からなる文字列が書かれており，会場の情報を表す．
N 行のうちの i 行目の j 文字目 (1 ≦ i ≦ N, 1 ≦ j ≦ M) は，会場のマス目の北から i 行目，西から j 列目のマスの状態を表す '#' または '.' のいずれかの文字である．'#' はそのマスに機材が置かれていることを，'.' はそのマスに機材が置かれていないことを表す．

出力

会場内に休憩スペースを設ける方法は何通りあるかを 1 行で出力せよ．

入出力例

入力例 1

3 5 2
...#.
#...#
....#

出力例 1

12

入力例 2

4 7 5
.#.....
.....##
.......
#......

出力例 2

7

入出力例 1 では，下の図に示すように，休憩スペースを設ける方法は全部で 12 通りある．

情報オリンピック日本委員会作 『第 16 回日本情報オリンピック JOI 2016/2017 予選競技課題』


### subroutines

def check_rank(favs, nofavs, j, k, l)
  tx, tname = nofavs[k - j]
  sum = 0

  for i in (0...j)
    xi, namei = favs[i]
    diff = tx - xi
    diff += 1 if namei > tname
    sum += diff if diff > 0
  end

  sum <= l
end

### main

loop do
  n, m, k, l = gets.split.map(&:to_i)
  break if (n | m | k | l) == 0

  chrs = []
  for i in (0...n)
    namei, xi = gets.strip.split
    chrs << [xi.to_i, namei]
  end

  fcache = {}
  m.times do
    fcache[gets.strip] = true
  end

  favs = []
  nofavs = []
  for ch in chrs.sort{|a, b| c = (b[0] <=> a[0]); c != 0 ? c : a[1] <=> b[1]}
    if fcache[ch[1]]
      favs << ch
    else
      nofavs << ch
    end
  end
  #p favs
  #p nofavs

  lb = 0
  ub = [m, k].min + 1

  while lb + 1 < ub
    mb = (lb + ub) / 2

    if k - mb > n - m
      lb = mb
      next
    end

    if check_rank(favs, nofavs, mb, k, l)
      lb = mb
    else
      ub = mb
    end
  end

  puts lb
end

Problem G : Everything Starts With Your Vote

ヒューリスティクスという言葉がある。確実にうまくいくという保証はないけれども大抵の場合はうまくいく、比較的単純なアプローチのことだ。単純にして強力であるがゆえに、この世の中は多くのヒューリスティクスで満ち溢れている。

ヒューリスティクスの一例として、こんなものが挙げられる。アニメ番組において、あるキャラクターの人気度は、そのアニメ本編中における登場時間の総和に比例する。確かにこれは多くの場合に成り立っているようだ。しかし、どうやら僕は少数派に属するらしい。影の薄いキャラ、背景にちらりと映るモブキャラなんかに限って可愛く見えたりするのだ。

自分の好きなキャラのことを、他人がどう思っていようがいいじゃないか。とは言ってられない事情が、残念ながらある。関連商品、フィギュアやキャラクターソングCDなどは、人気のあるキャラのものから優先的に発売される傾向にあるのだ。商業的には当然の選択だとはいえ、不人気キャラのファンの肩身は狭い。

そこで重要となってくるのが、アニメ番組の制作会社によって行われる人気投票である。実際の人気がどうであれ、ここで多くの票を獲得すれば、関連商品への道が開かれるのだ。どんな手段を使っても票を集めねばなるまい。

厳正なる投票のために、ある関連商品を1つ購入するたびに1票の投票権が与えられる。この仕組を厳正と呼ぶべきかどうかは今大きく議論されているが、とにかく僕は L 票の投票権を得た。投票の対象となるキャラは全部で N 人いて、より多くの票を獲得した K 人のキャラ (同票の場合は名前の辞書順) の関連商品が企画されることになる。僕の好きなキャラは全部で M 人いて、その中からできるだけ多くのキャラを上位 K 人に入れたいと思っている。

僕はまず、それぞれのキャラがどれだけの票を獲得するかを予測した(難しいことではない。あるキャラクターの人気度は、その登場時間の総和に比例すると仮定しただけだ)。この予測が正しいとして、より多くの僕の好きなキャラの関連商品が発売されるようにするためには、僕はこの L 票を誰にどれだけ投じればいいだろうか。

Input

入力は複数のケースからなる。
各ケースは以下のフォーマットで与えられる。

N M K L
name0 x0
.
.
.
nameN-1 xN-1
fav0
.
.
.
favM-1

N、M、K、Lの意味は問題文に記されているとおりである。

namei　はキャラクターの名前、xi　はi 番目のキャラクターの票の総数を表す。

favi はあなたがひいきしているキャラクターの名前を表す。これらの名前は必ず異なり、また必ずキャラクターの名前の入力の中に含まれる。

入力の終わりはN = 0 かつ M = 0 かつ K = 0 かつ L = 0からなる行によって与えられる

また各値は以下の条件を満たす

1 ≤ N ≤ 100,000

1 ≤ M ≤ N

1 ≤ K ≤ N

1 ≤ L ≤ 100,000,000

0 ≤ xi ≤ 100,000,000

nameiはアルファベットのみを含み、長さは10文字以下である。

テストケースの数は150を超えない。

また20,000 ≤ N となるケースの数は20を超えないことが保証されている。

ジャッジデータは大きいので、速い入力を使うことを推奨する。

Output

M 人のキャラの中から最大で何人を上位K 人に入れることが出来るかを1行で出力せよ。

Sample input

4 1 3 4
yskwcnt 16
akzakr 7
tsnukk 12
fnmyi 13
akzakr
4 1 3 5
akzakr 7
tsnukk 12
fnmyi 13
yskwcnt 16
akzakr
4 2 2 1
akzakr 4
tsnukk 6
yskwcnt 6
fnmyi 12
akzakr
fnmyi
5 2 3 28
knmmdk 6
skrkyk 14
tmemm 14
akmhmr 15
mksyk 25
knmmdk
skrkyk
5 2 3 11
tmemm 12
skrkyk 18
knmmdk 21
mksyk 23
akmhmr 42
skrkyk
tmemm
14 5 10 38
iormns 19
hbkgnh 23
yyitktk 31
rtkakzk 36
mmftm 43
ykhhgwr 65
hrkamm 66
ktrotns 67
mktkkc 68
mkhsi 69
azsmur 73
tknsj 73
amftm 81
chyksrg 88
mkhsi
hbkgnh
mktkkc
yyitktk
tknsj
14 5 10 38
mktkkc 24
rtkakzk 25
ykhhgwr 25
hrkamm 27
amftm 37
iormns 38
tknsj 38
yyitktk 39
hbkgnh 53
mmftm 53
chyksrg 63
ktrotns 63
azsmur 65
mkhsi 76
mkhsi
hbkgnh
mktkkc
yyitktk
tknsj
0 0 0 0

Sample output

0
1
1
2
1
4
5

The University of Aizu Programming Contest 2011 Summer

原案: Tomoya Sakai

問題文: Takashi Tayama


loop.with_index {|_, i|
    n = gets.to_i
    break if n == 0
    points = (1..n).map{ gets.split.map(&:to_i) }

    area = 0
    (points + [points[0]]).each_cons(2){|u, v|
        x1, y1 = u
        x2, y2 = v
        area += x1 * y2 - x2 * y1
    }
    printf("%d %.1f\n", i + 1, area.abs / 2.0)

    gets
}

Area of Polygons

Polygons are the most fundamental objects in geometric processing.
Complex figures are often represented and handled as polygons
with many short sides.
If you are interested in the processing of geometric data,
you'd better try some programming exercises about basic
operations on polygons.

Your job in this problem is to write a program that computes the area of polygons.

A polygon is represented by a sequence of points that are its vertices.
If the vertices p1, p2, ..., pn are given, line segments connecting
pi and pi+1 (1 <= i <= n-1) are sides of the polygon.
The line segment connecting pn and p1 is also a side of the polygon.

You can assume that the polygon is not degenerate.
Namely, the following facts can be assumed without any input data checking.

No point will occur as a vertex more than once.

Two sides can intersect only at a common endpoint (vertex).

The polygon has at least 3 vertices.

Note that the polygon is not necessarily convex.
In other words, an inner angle may be larger than 180 degrees.

Input

The input contains multiple data sets, each representing a polygon.
A data set is given in the following format.

n
x1 y1
x2 y2
...
xn yn

The first integer n is the number of vertices,
such that 3 <= n <= 50.
The coordinate of a vertex pi is given by (xi, yi).
xi and yi are integers between 0 and 1000 inclusive.
The coordinates of vertices are given in the order
of clockwise visit of them.

The end of input is indicated by a data set with 0 as the value of n.

Output

For each data set, your program should output its sequence number
(1 for the first data set, 2 for the second, etc.) and the area of the polygon separated by a single space. The area should be printed with one digit to the right of the decimal point.

The sequence number and the area should be printed on the same line.
Since your result is checked by an automatic grading program,
you should not insert any extra characters nor lines on the output.

Sample Input

3
1 1
3 4
6 0

7
0 0
10 10
0 20
10 30
0 40
100 40
100 0

0

Output for the Sample Input

1 8.5
2 3800.0


def isPrime(num)
  return false if num < 2
  return true if num == 2
  n = 2
  while n <= Math.sqrt(num) + 1
    return false if num % n == 0
    n += 1
  end
  return true
end

def compute(init, diff, num)
  found = 0
  n = init
  while true
    found += 1 if isPrime(n)
    if found == num
      puts n
      return
    end
    n += diff
  end

end

while line = gets.split(" ")
  a = line[0].to_i
  d = line[1].to_i
  n = line[2].to_i
  break if a == 0 and d == 0 and n == 0

  compute(a, d, n)
end

Problem A: Dirichlet's Theorem on Arithmetic Progressions

Good evening, contestants.

If a and d are relatively prime positive integers,
the arithmetic sequence beginning with a
and increasing by d, i.e.,
a,
a + d,
a + 2d,
a + 3d,
a + 4d,
...,
contains infinitely many prime numbers.
This fact is known as Dirichlet's Theorem on Arithmetic Progressions,
which had been conjectured by Johann Carl Friedrich Gauss (1777 - 1855)
and was proved by Johann Peter Gustav Lejeune Dirichlet (1805 - 1859)
in 1837.

For example,
the arithmetic sequence beginning with 2 and increasing by 3,
i.e.,

2,
5,
8,
11,
14,
17,
20,
23,
26,
29,
32,
35,
38,
41,
44,
47,
50,
53,
56,
59,
62,
65,
68,
71,
74,
77,
80,
83,
86,
89,
92,
95,
98,
...
,

contains infinitely many prime numbers

2,
5,
11,
17,
23,
29,
41,
47,
53,
59,
71,
83,
89,
...

.

Your mission, should you decide to accept it,
is to write a program to find
the nth prime number in this arithmetic sequence
for given positive integers a, d, and n.

As always, should you or any of your team be tired or confused,
the secretary disavow any knowledge of your actions.
This judge system will self-terminate in three hours.
Good luck!

Input

The input is a sequence of datasets.
A dataset is a line containing three positive integers
a, d, and n separated by a space.
a and d are relatively prime.
You may assume a <= 9307, d <= 346,
and n <= 210.

The end of the input is indicated by a line
containing three zeros separated by a space.
It is not a dataset.

Output

The output should be composed of
as many lines as the number of the input datasets.
Each line should contain a single integer
and should never contain extra characters.

The output integer corresponding to
a dataset a, d, n should be
the nth
prime number among those contained
in the arithmetic sequence beginning with a
and increasing by d.

FYI, it is known that the result is always less than
106 (one million)
under this input condition.

Sample Input

367 186 151
179 10 203
271 37 39
103 230 1
27 104 185
253 50 85
1 1 1
9075 337 210
307 24 79
331 221 177
259 170 40
269 58 102
0 0 0

Output for the Sample Input

92809
6709
12037
103
93523
14503
2
899429
5107
412717
22699
25673


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

  total = 0
  max = 0
  min = 1000
  n.times do |i|
    score = gets.chomp.to_i
    max = max < score ? score : max
    min = min > score ? score : min
    total += score
  end

  puts (total - (max + min)) / (n - 2)
end

Problem A: ICPC Score Totalizer Software

The International Clown and Pierrot Competition (ICPC), is one of the
most distinguished and also the most popular events on earth in the
show business.

One of the unique features of this contest is the great number of
judges that sometimes counts up to one hundred. The number of judges
may differ from one contestant to another, because judges with any
relationship whatsoever with a specific contestant are temporarily
excluded for scoring his/her performance.

Basically, scores given to a contestant's performance by the judges
are averaged to decide his/her score. To avoid letting judges with
eccentric viewpoints too much influence the score, the highest and the
lowest scores are set aside in this calculation. If the same highest
score is marked by two or more judges, only one of them is ignored.
The same is with the lowest score. The average, which may contain
fractions, are truncated down to obtain final score as an integer.

You are asked to write a program that computes the scores of
performances, given the scores of all the judges, to speed up the event
to be suited for a TV program.

Input

The input consists of a number of datasets, each corresponding to a
contestant's performance. There are no more than 20 datasets in the input.

A dataset begins with a line with an integer n, the number of
judges participated in scoring the performance (3 ≤ n ≤
100). Each of the n lines following it has an integral
score s (0 ≤ s ≤ 1000) marked by a judge. No
other characters except for digits to express these numbers are in the
input. Judges' names are kept secret.

The end of the input is indicated by a line with a single zero in it.

Output

For each dataset, a line containing a single decimal integer
indicating the score for the corresponding performance should be
output. No other characters should be on the output line.

Sample Input

3
1000
342
0
5
2
2
9
11
932
5
300
1000
0
200
400
8
353
242
402
274
283
132
402
523
0

Output for the Sample Input

342
7
300
326


### main

loop do
  n, k, m = gets.split.map(&:to_i)
  break if (n | k | m) == 0
  #p [n, k, m]

  pos = m - 1
  sts = (1..n).to_a
  sts.delete_at(pos)

  while sts.length > 1
    pos = (pos + k - 1) % sts.length
    sts.delete_at(pos)
  end

  puts sts.first
end

Problem A: And Then There Was One

Let’s play a stone removing game.

Initially, n stones are arranged on a circle and numbered 1, ... , n clockwise (Figure 1). You are also given two numbers k and m. From this state, remove stones one by one following the rules explained below, until only one remains. In step 1, remove stone m. In step 2, locate the k-th next stone clockwise from m and remove it. In subsequent steps, start from the slot of the stone removed in the last step, make k hops clockwise on the remaining stones and remove the one you reach. In other words, skip (k - 1) remaining stones clockwise and remove the next one. Repeat this until only one stone is left and answer its number.

For example, the answer for the case n = 8, k = 5, m = 3 is 1, as shown in Figure 1.

Figure 1: An example game

Initial state: Eight stones are arranged on a circle.

Step 1: Stone 3 is removed since m = 3.

Step 2: You start from the slot that was occupied by stone 3. You skip four stones 4, 5, 6 and 7 (since k = 5), and remove the next one, which is 8.

Step 3: You skip stones 1, 2, 4 and 5, and thus remove 6. Note that you only count stones that are still on the circle and ignore those already removed. Stone 3 is ignored in this case.

Steps 4-7: You continue until only one stone is left. Notice that in later steps when only a few stones remain, the same stone may be skipped multiple times. For example, stones 1 and 4 are skipped twice in step 7.

Final State: Finally, only one stone, 1, is on the circle. This is the final state, so the answer is 1.

Input

The input consists of multiple datasets each of which is formatted as follows.

n k m

The last dataset is followed by a line containing three zeros. Numbers in a line are separated by a single space. A dataset satisfies the following conditions.

2 ≤ n ≤ 10000, 1 ≤ k ≤ 10000, 1 ≤ m ≤ n

The number of datasets is less than 100.

Output

For each dataset, output a line containing the stone number left in the final state. No extra characters such as spaces should appear in the output.

Sample Input

8 5 3
100 9999 98
10000 10000 10000
0 0 0

Output for the Sample Input

1
93
2019


require 'set'

n, m = gets.split.map(&:to_i)
s = gets.split.join.to_i(2)
g = gets.split.map(&:to_i)

queue = [s]
reached = Set[s]
step = 0

loop do
    new_queue = []
    until queue.empty?
        x = queue.pop
        if sprintf("%0#{n}b",x).scan(/0+|1+/).map(&:size) == g
            p step
            exit
        end

        (0..n-2).each do |i|
            next if [0b11, 0b00].include?((x >> i) & 0b11)
            y = x ^ (0b11 << i)
            next if reached.include?(y)
            reached << y
            new_queue << y
        end
    end
    queue = new_queue
    step += 1
    break if queue.empty?
end

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

Problem A:
Bit String Reordering

You have to reorder a given bit string as specified. The only operation allowed is swapping adjacent bit pairs. Please write a program that calculates the minimum number of swaps required.

The initial bit string is simply represented by a sequence of bits, while the target is specified by a run-length code. The run-length code of a bit string is a sequence of the lengths of maximal consecutive sequences of zeros or ones in the bit string. For example, the run-length code of "011100" is "1 3 2". Note that there are two different bit strings with the same run-length code, one starting with zero and the other starting with one. The target is either of these two.

In Sample Input 1, bit string "100101" should be reordered so that its run-length code is "1 3 2", which means either "100011" or "011100". At least four swaps are required to obtain "011100". On the other hand, only one swap is required to make "100011". Thus, in this example, 1 is the answer.

Input

The input consists of a single test case. The test case is formatted as follows.

$N$ $M$

$b_1$ $b_2$ . . . $b_N$

$p_1$ $p_2$ . . . $p_M$

The first line contains two integers $N$ ($1 \leq N \leq 15$) and $M$ ($1 \leq M \leq N$). The second line
specifies the initial bit string by $N$ integers. Each integer $b_i$ is either 0 or 1. The third line contains the run-length code, consisting of $M$ integers. Integers $p_1$ through $p_M$ represent the lengths of consecutive sequences of zeros or ones in the bit string, from left to right. Here, $1 \leq p_j$ for $1 \leq j \leq M$ and $\sum^{M}_{j=1} p_j = N$ hold. It is guaranteed that the initial bit string can be reordered into a bit string with its run-length code $p_1, . . . , p_M$.

Output

Output the minimum number of swaps required

Sample Input 1

6 3
1 0 0 1 0 1
1 3 2

Sample Output 1

1

Sample Input 2

7 2
1 1 1 0 0 0 0
4 3

Sample Output 2

12

Sample Input 3

15 14
1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
1 1 1 1 1 1 1 1 1 1 1 1 1 2

Sample Output 3

7

Sample Input 4

1 1
0
1

Sample Output 4

0


loop do
    n, m = gets.split(' ').map(&:to_i)

    break if n == 0 && m == 0

    a = gets.split(' ').map(&:to_i)

    ans = -1

    (0..n-2).each do |i|
        (i+1..n-1).each do |j|
            if a[i] + a[j] <= m
                ans = [a[i] + a[j], ans].max
            end
        end
    end
    puts ans == -1 ? 'NONE' : ans
end

Taro's Shopping

Mammy decided to give Taro his first shopping experience.
Mammy tells him to choose any two items he wants from those
listed in the shopping catalogue,
but Taro cannot decide which two, as all the items look attractive.
Thus he plans to buy the pair of two items with
the highest price sum, not exceeding the amount Mammy allows.
As getting two of the same item is boring, he wants two different items.

You are asked to help Taro select the two items.
The price list for all of the items is given.
Among pairs of two items in the list,
find the pair with the highest price sum
not exceeding the allowed amount,
and report the sum.
Taro is buying two items, not one, nor three, nor more.
Note that, two or more items in the list may be priced equally.

Input

The input consists of multiple datasets, each in the following format.

n m
a1 a2 ... an

A dataset consists of two lines.
In the first line, the number of items n and the maximum
payment allowed m are given.
n is an integer satisfying 2 ≤ n ≤ 1000.
m is an integer satisfying 2 ≤ m ≤ 2,000,000.
In the second line, prices of n items are given.
ai (1 ≤ i ≤ n) is the price
of the i-th item.
This value is an integer greater than or equal to 1 and
less than or equal to 1,000,000.

The end of the input is indicated by a line containing two zeros.
The sum of n's of all the datasets does not exceed 50,000.

Output

For each dataset, find the pair with the highest price sum
not exceeding the allowed amount m
and output the sum in a line.
If the price sum of every pair of items exceeds m,
output NONE instead.

Sample Input

3 45
10 20 30
6 10
1 2 5 8 9 11
7 100
11 34 83 47 59 29 70
4 100
80 70 60 50
4 20
10 5 10 16
0 0

Output for the Sample Input

40
10
99
NONE
20


def dir2num(str)
  case str
  when 'N' then [0, 1]
  when 'E' then [1, 0]
  when 'S' then [0, -1]
  when 'W' then [-1, 0]
  end
end

def move_robot(arr)
  $r.each do |arr|
    arr[1].to_i.times do
      $moved_pos << $pos = $pos.zip(dir2num(arr[0])).map{ |a| a.inject(:+) }
    end
  end
end
a = []
while line = gets
  break if line.to_i == 0
  h_num = line.to_i
  $pos = [10, 10]
  $h_pos = []
  $moved_pos = []
  h_num.times do
    $h_pos << gets.split.map(&:to_i)
  end
  r_num = gets.to_i
  $r = []
  r_num.times do
    $r << gets.split
  end

  move_robot($r)
  ($h_pos - $moved_pos).none? ? a << "YES" : a << "NO"
end

a.each do |i|
  puts i
end

Mysterious Gems

宇宙暦 1603〜1867 年，人々はその時代のことを EDO 時代と呼ぶ．EDO とは当時最先端の宇宙航行技術，Enhanced Driving Operation のことであり、1603 年に Dr.Izy によって開発された．

あなたは宇宙冒険家であり，宇宙を飛び回って様々な惑星を冒険していた．その冒険の途中で，あなたはとても不思議な惑星を発見した．その惑星には，至るところに七色に輝く不思議な宝石が落ちていた．あなたはその惑星への降下を試みようと考えたが，重大な問題のためにそれは不可能であることがわかった．その惑星の空気には，人間が触れただけで即死してしまうような猛毒の成分が含まれていたのだ．

そこで，あなたはロボットを使って宝石を回収することを考えついた．あなたはその惑星の周回軌道にて待機する．そして，降下させたロボットを遠隔操作することによって宝石を回収するのだ．あなたは，ロボットに「移動する方向」と「移動する距離」の組からなる命令の列によってロボットを遠隔操作する．ロボットは移動経路上（到達点を含む）に宝石を見つけると，それらを全て回収する．

あなたの仕事は，ロボットが与えられた全ての命令の実行を終えたときに，全ての宝石を回収することができたかどうかを判定するプログラムを書くことである．

なお，ロボットが不思議な宝石を回収する範囲はそれほど広くない．そのため，ロボットが移動する範囲は全て 2 次元の平面で表すことができる．そして，ロボットが移動する範囲は (0,0) および (20,20) をそれぞれ左下隅および右上隅とする正方形の内部（境界線を含む）である．ロボットは常に範囲の中央，すなわち (10,10) の座標に降下する．また，全ての宝石は中央以外の格子点上にあることが保証されている．

Input

入力は複数のデータセットにより構成される．

それぞれのデータセットの先頭行には，単一の正の整数 N (1 <= N <= 20) が含まれる。これはロボットが移動可能な範囲内にある不思議な宝石の個数を表す．次の N 行には，それぞれ xi および yi (0 <= xi , yi <= 20) が含まれ，これは i 番目の不思議な宝石の落ちている座標を表す．なお，1 つの場所に複数の宝石が落ちていることはない．

次の行には単一の整数 M (1 <= M <= 30) が含まれ，これはロボットに与えた命令の個数を表す．この後の M 行にはそれぞれ dj とひとつの正の整数 lj が含まれる．これは j 番目の命令における方向および移動量を表す．ただし，方向は N，E，S，W のいずれかの文字であり，順に北，東，南，西を表す（北は y 軸の正方向，東は x 軸の正方向）．なお，ロボットが移動可能な範囲を超えるような命令は与えられないことが保証されている．

入力は N = 0 のときに終了し，これはデータセットに含まれない．

Output

それぞれのデータセットについて，ロボットが全ての宝石を収集できるときは「Yes」と，そうでないときは「No」と 1 行に出力しなさい．

Sample Input

2
10 11
11 12
2
N 2
E 1
2
10 11
11 12
2
N 2
W 1
3
0 15
5 10
5 15
5
W 10
S 10
N 20
E 10
S 10
0

Output for the Sample Input

Yes
No
No


input_data = gets.chomp
s = input_data.to_i
while s != 0 do
    #21 x 21の２次元配列
    gems = Array.new(21).map{Array.new(21, false)}
    # p gems

    s.times do
        g = gets.chomp.split(" ")
        x = g[0].to_i
        y = g[1].to_i
        gems[x][y] = true
    end

    input_data = gets.chomp
    r = input_data.to_i

    rx = 10
    ry = 10

    r.times do
        g = gets.chomp.split(" ")
        news = g[0]
        move = g[1].to_i
        dx = 0
        dy = 0
        if news == 'N'
            dy = 1
        elsif news == 'E'
            dx = 1
        elsif news == 'S'
            dy = -1
        else
            dx = -1
        end
        move.times do
            rx += dx
            ry += dy
            gems[rx][ry] = false
        end
    end

    flag = false

    gems.each do |v|
        v.each do |vv|
            if vv
                flag = true
                break
            end
        end
        break if flag
    end

    if flag
        puts 'No'
    else
        puts 'Yes'
    end
    input_data = gets.chomp
    s = input_data.to_i
end


while gets
  n, a, b, c, x = $_.split.map(&:to_i)
  break if n == 0
  res = gets.split.map(&:to_i).reduce(0) do |cnt, i|
    if x != i && cnt != -1
      until x == i
        x = (a * x + b) % c
        cnt += 1
        break if cnt > 10000
      end
    end
    x = (a * x + b) % c
    if cnt < 0 || 10000 < cnt then -1
    else cnt + 1
    end
  end
  p res >= 0 ? res - 1 : res
end

Problem A: Luck Manipulator

Nathan O. Davis くんは，あるゲームを攻略中であり，非常にレアなアイテムを手に入れようと四苦八苦していた．このレアなアイテムは，カジノのスロットマシーンで特殊な絵柄を一列に揃えたときに手に入れることができる．スロットマシーンには N 個のリールがあり，ボタンを一回押すと現在回転している最も左側のリールが停止する．そのため，このレアアイテムを手に入れるためには N 回ボタンを押す必要がある．また，特殊な絵柄で停止させるためにはあるタイミングでボタンを押す必要がある．ところが，このボタンを押すタイミングは非常にシビアであるため，なかなか上手くいかずに困っていた．そこで，Nathan くんはメモリビューアを利用して，ゲーム中におけるメモリの値を確認しながらゲームを解析することにした．

Nathan くんの解析の結果，その特殊な絵柄でリールを停止させるためには，ボタンが押された時に，メモリの 007E0D1F 番地に書き込まれた「乱数」が特定の値になっている必要があることを突き止めた．乱数の値は 1 フレーム毎に線形合同法によって変化しており，またボタンが押されたかどうかの判定は 1 フレーム毎に 1 回行われていることも分かった．ここで，線形合同法とは擬似乱数を生成するための方法の一つであり，以下の式によって値を決定する．

x' = (A × x + B) mod C

ここで，x は現在の乱数の値，x' は次の乱数の値，A, B, C は何らかの定数である．また，y mod z は y を z で割ったときの余りを表す．

例えば，2 個のリールを持つスロットマシーンで A = 5，B = 7，C = 11 で，最初の「乱数」の値が 10 であったとする．そして，特殊な絵柄でリールを止めるための条件は，左側のリールが 2，右側のリールが 4 であったとする．このとき，1 フレーム目における乱数の値は (5 × 10 + 7) mod 11 = 2 であるため，1 フレーム目にボタンを押せば左側のリールは特殊な絵柄で停止する．続く 2 フレーム目での乱数の値は (5 × 2 + 7) mod 11 = 6 であるから，2 フレーム目にボタンを押しても右側のリールは特殊な絵柄では停止しない．続く 3 フレーム目では乱数の値が (5 × 6 + 7 ) mod 11 = 4 になるので，3 フレーム目にボタンを押せば右側のリールは特殊な絵柄で停止する．よって，最短 3 フレームで全てのリールを特殊な絵柄で停止されることができ，レアなアイテムを手に入れることができる．

あなたの仕事は，最短で何フレーム目に全てのリールを特殊な絵柄で停止させることができるかを求めるプログラムを書いて，Nathan くんがレアなアイテムを手に入れられるよう助けてあげることである．

Input

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

N A B C X

Y1 Y2 ... YN

最初の行には 5 つの整数 N (1 ≤ N ≤ 100) ，A, B (0 ≤ A, B ≤ 10,000)，C (1 ≤ C ≤ 10,000) ，X (0 ≤ X < C) がそれぞれ 1 つの空白文字で区切られて与えられる．ここで，X は最初の乱数の値を表す．続く行では，N 個の整数 Y1, Y2, ... , YN (0 ≤ Yi ≤ 10,000) が 1 つの空白文字で区切られて与えられる．これらは，リールを特定の絵柄で止めるための条件を表しており，その第 i 番目の数 Yi は，左から i 番目のリールを特殊な絵柄で停止するためには，乱数の値が Yi である必要がある，いう意味である．

入力の終わりは，空白で区切られた 5 つの 0 を含む 1 行で示される．

Output

各データセットについて，特殊な絵柄で停止させるために必要となる最短のフレーム数を 1 行に出力せよ．なお，10,000 フレーム以内に停止させることができない場合は，フレーム数の代わりに -1 を出力せよ．出力に余計な空白や改行を含めてはならない．

Sample Input

1 5 7 11 10
10
2 5 7 11 10
2 4
2 1 1 256 0
128 255
2 0 0 1 0
1234 5678
2 1 1 100 0
99 98
2 1 1 100 0
99 99
2 1 1 10000 0
1 0
2 1 1 10000 0
2 1
0 0 0 0 0

Output for the Sample Input

0
3
255
-1
198
199
10000
-1


N = gets.to_i
P = N.times.map{gets.to_i} + [0]*6

move = [nil]*(N+6)

# dfs1 = lambda do |i|
#     if move[i] == -1
#         move[i] = false
#         next false
#     end
#     next move[i] = move[i] if move[i] != nil
#     next move[i] = i       if P[i] == 0
#     move[i] = -1
#     res = dfs1.call(i+P[i])
#     next move[i] = res     if res
#     next move[i] = false
# end
#
# (N+6).times do |i|
#     dfs1.call(i)
# end

(N+6).times do |i|
    ptr = i
    stack = []
    while move[ptr] == nil
        if P[ptr] == 0
            move[ptr] = ptr
            break
        end
        move[ptr] = -1
        stack << ptr
        ptr = ptr + P[ptr]
    end
    if move[ptr] == -1 || move[ptr] == false
        stack.each do |j|
            move[j] = false
        end
    else
        stack.reverse_each do |j|
            move[j] = move[ptr]
            ptr = j
        end
    end
end

dp = [10101010]*(N+6)
dp[0] = 0

(N-1).times do |ptr|
    1.upto(6) do |hop|
        to = move[ptr+hop]
        dp[to] = [dp[to], dp[ptr]+1].min if to
    end
end

p dp[N-1]

Problem 3: 時空のスゴロク・ロード

全時空統一ディメンション・スゴロク・トーナメント。500 兆人を超える参加者の中から、ただ１人
のスゴロク絶対王者を決定するその大会に、あなたは２１世紀の地球代表として参加している。

今あなたが挑戦している課題は、自分自身をコマとした１次元スゴロク。端のスタートマスから出発
して、１から６までの目が一つずつ書かれた巨大な６面ダイスを振って出た目の数だけ進むことを繰
り返す、あなたもよく知っている形式のスゴロクだ。スタートマスとは反対の端にあるゴールマスに
止まるとゴールとなる。もちろん、ゴールするまでにサイコロを振った回数が少なければ少ないほど
良い成績となる。

マスの中には特殊な効果を持ったマス「○マス進む」と「○マス戻る」が存在し、そこに止まってし
まうと、指定されたマス数だけ進む、もしくは戻らなければならない。マスの効果で動いた結果、ふ
たたび効果のあるマスに止まった場合は、続けて指示どおりに移動する。

しかし、これは一筋縄では攻略できない時空スゴロクだ。恐るべきことに、たとえば「３マス進む」
の３マス先に「３マス戻る」が置かれていることもありうる。このようなマスに止まり、マスの効果
で無限ループに陥ってしまった場合は、永遠にマスを往復し続けなければならない。

だが幸いなことに、あなたの身体には、望んだ事象を全事象に変えることのできる異能『確率湾曲』
が宿っている。この能力を使えば、サイコロの出目を自由に操ることも可能。このアドバンテージを
活かして、無限ループに陥らないようにしながら進んでいくとき、ゴールするまでにサイコロを振る
回数の最小値はいくつになるだろうか。

Input

N

p1

p2

.

.

.

pN

入力の１行目には、整数 N（3 ≤ N ≤ 100,000）が書かれている。これは、スゴロクのマス数をあらわす。マスには1 番からN 番までの番号がふられている。スタートのマスが1 番で、それからスタートに近い順に2 番、3 番、……、N - 1 番と続き、ゴールのマスがN 番である。i 番のマスでサイコロを振ってj の目が出たら、i + j 番のマスへと移動する。ただし、もしもi + j がN を超えていたら、余った数だけ戻ったりはせず、ゴールしたとみなされる。

続くN 行には、整数 pi（-100,000 ≤ pi ≤ 100,000）が書かれている。1 ＋ i 行目に書かれた整数 pi
は、i 番のマスに書かれている指示をあらわす。pi > 0 ならば「pi マス進む」、pi < 0 ならば「-pi マス戻る」であり、pi = 0 ならばそのマスには何の効果もない。p1 とpN は必ず0 である。マスの効果で、スタートより前やゴールより後に移動しろと指示されることはない。

なお、与えられるスゴロクは、ゴールすることが可能であると仮定してよい。

Output

ゴールするまでにサイコロを振る回数の最小値を出力せよ。

Sample Input 1

11
0
0
-2
0
-4
1
-1
2
0
0
0

Sample Output 1

3

Sample Input 2

12
0
0
7
0
2
0
0
3
-6
-2
1
0

Sample Output 2

1

Sample Input 3

8
0
4
-1
1
-2
-2
0
0

Sample Output 3

2


m, n, m0, md, n0, nd = gets.split.map(&:to_i)

degs_l = [m0]
(m - 1).times do
    degs_l << (degs_l[-1] * 58 + md) % (n + 1)
end

degs_r = [n0]
(n - 1).times do
    degs_r << (degs_r[-1] * 58 + nd) % (m + 1)
end

degs_l.sort!
degs_r.sort!

k = 0
degs_l.each do |x|
    degs_r.reject! {|y| y == 0}
    x = [x, degs_r.size].min
    k += x
    (-x..-1).each {|i| degs_r[i] -= 1}
end

p k

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

Problem F:
RabbitLunch

うさぎは昼食ににんじんとキウイを1 個ずつ食べる. うさぎはとても個性的なので, 食べるにんじんの種類もキウイの種類も同じであるような, 異なる2 匹のうさぎが存在してはならない.

にんじんは $M$ 種類ある. $i$ 種類目のにんじんは $m_i$ 個ある. キウイは $N$ 種類ある. $i$ 種類目のキウイは $n_i$ 個ある. 最大何匹のうさぎが昼食をとれるか求めよ.

$m_i$ と $n_i$ は次の漸化式を用いて生成せよ.

$m_0 = m0$

$m_{i+1} = (m_i * 58 + md )$ mod $(N + 1)$

$n_0 = n0$

$n_{i+1} = (n_i * 58 + nd )$ mod $(M + 1)$

Constraints

$M$ will be between 1 and 2,500,000, inclusive.

$N$ will be between 1 and 2,500,000, inclusive.

$m0$ and $md$ will be between 0 and $N$, inclusive.

$n0$ and $nd$ will be between 0 and $M$, inclusive.

Input

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

$M$ $N$ $m0$ $md$ $n0$ $nd$

Output

昼食をとれるうさぎの匹数の最大値を表す整数を 1 行に出力せよ.

Sample Input 1

2 3 1 3 1 0

Sample Output 1

2

Sample Input 2

5 8 1 2 3 4

Sample Output 2

19