A - 東京都

Time Limit: 2 sec / Memory Limit: 256 MB

問題文

KUPC2015は東京京都の二箇所でオンサイトが開催されている. あなたはKUPCの告知を手伝うことにした.
英小文字からなる文字列が印字されたテープがある.あなたはこのテープを文字同士の間でのみ好きなだけ自由に切ってもよい.
あなたはtokyokyotoのいずれかの文字列を含むテープをなるべくたくさん作りたい.ただし,一旦切ったテープを後でくっつけることはできないものとする.
作る事ができるtokyoもしくはkyotoを含むテープの数の最大値を出力せよ.


入力

入力は以下の形式で標準入力から与えられる.

T
S_1
:
S_T
  • 1 行目にはテストケースの数を表す整数 T ( 1 \leq T \leq 100 ) が与えられる.
  • 続いて T 個のテストケースが順に与えられ, i ( 1 \leq i \leq T ) 行目には英小文字のみからなる文字列 S_i が与えられる.
  • 各文字列の長さは 1 以上 100 以下であることが保証される.

出力

出力は T 行からなる.各テストケースに対する答えのみを順に出力せよ.

入力例

3
higashikyoto
kupconsitetokyotokyoto
goodluckandhavefun

出力例

1
2
0

higashikyotoと書かれたテープはkyotoを含んでいるので,そのまま切り分けなくても目的のテープが 1 つ得られる.

kupconsitetokyotokyotoと書かれたテープを{kupconsitetokyo, to, kyoto}と切り分けると,目的のテープが 2 つ得られる.

どう切り分けても目的のテープが得られない場合も存在しうる.


Source Name

京都大学プログラミングコンテスト2015
B - GUARDIANS

Time Limit: 2 sec / Memory Limit: 256 MB

問題文

あなたは幾多の試練を乗り越えた凄腕の冒険者であり,冒険で数々の宝物を手にした.これらを隠しダンジョンの奥にある宝物庫に保管し,番犬と妖怪鎖頭に守ってもらうことにした.隠しダンジョンは以下のような 10 \times 10 の空間であり,一番左の 10 マス全てがダンジョンの入り口とつながっていて,一番右の 10 マス全てが宝物庫へとつながっている.

..........
..........
..........
..........
..........
..........
..........
..........
..........
..........

現在,隠しダンジョンには何も置かれていない.宝を狙う命知らずな侵入者は一番左のいずれかのマスから侵入し,一番右のいずれかのマスを目指す. 侵入者が隠しダンジョンに入ると同時に番犬が左から侵入者を追いかけるので,侵入者は右上,右,右下のいずれかのマスにしか移動できない. また, 10 \times 10 の空間の外に出ることもできない. あなたは隠しダンジョンに鎖頭をたくさん配置して侵入者を阻むことにした.鎖頭は以下の特徴をもつ.

  • 鎖頭は移動することができない.
  • 鎖頭は縦横斜めの好きな方向に自分がいるマスから2マス先まで頭を投げつける一撃必殺の攻撃を放つ.
鎖頭がいる場所を C とすると,その 鎖頭 の攻撃可能な範囲は以下の X で表される.侵入者は以下のC, Xが書かれた範囲に立ち入ると,再起不能となる.
.......
.X.X.X.
..XXX..
.XXCXX.
..XXX..
.X.X.X.
.......

隠しダンジョンを鎖頭で埋め尽くしてしまうと全ての侵入者を排除できるが,それでは面白くないと感じたあなたは,侵入者が鎖頭に攻撃されずにスタートからゴールへたどり着けるルートがただひとつだけ存在するように鎖頭を配置し,見事突破した侵入者にはその知略を称えて宝物の一部を差し出すことにした.

鎖頭を雇うには大金がかかる.あなたは倹約家でもあり,雇う鎖頭の数はなるべく少ないほうが良い.多くても誤答とはならないが,満点が得られるとは限らない.詳しくは部分点の制約を確認してほしい.経路が一通りに定まる配置をひとつ出力せよ.


入力

この問題に入力は存在しない.

出力

10 \times 10 の隠しダンジョンの盤面を出力せよ.Cはそこに鎖頭が配置されることを表し,.はそこには何もないことを表す.追記: Cは大文字であることに注意せよ. 出力にこれら2種類の文字と改行以外が含まれている場合,出力は問題の条件を満たしていないものとみなされるので注意せよ.

部分点

この問題には部分点が存在する.配点は以下の通りである.
  • 盤面が問題文中の左端から右端への経路をただ一通りに定める場合,Accepted と判定され, N 体の鎖頭 を配置した時,floor(400 (max(4, N-1))) 点が与えられる.
  • そうでない場合,Wrong Answer と判定され,点数は得られない.
  • システムの都合上,Accepted X 点を獲得した場合,それまでに提出した Accepted な解法のうち, X 点 未満のものは全て誤答としてカウントされ,ペナルティが発生するので注意すること.

ヒント

  • N = 5 の解でも満点が得られるが, N = 4 の解も存在する.

出力例1

CCCCCCCCCC
CCCCCCCCCC
..........
..........
..........
..........
..........
CCCCCCCCCC
CCCCCCCCCC
CCCCCCCCCC

左端から右端までの経路が一通りのみ存在し,配置した鎖頭50 体である.この盤面を提出した場合, 8 点が得られる.


出力例2

CCCCC.C...
CCCC.C....
CCC.C.....
CC.C.....C
C.C.....C.
.C.....C.C
C.....C.CC
.....C.CCC
....C.CCCC
...C.CCCCC

左端から右端までの経路が一通りのみ存在し,配置した鎖頭44 体である.この盤面を提出した場合, 9 点が得られる.


出力例3

CCCCCCCCCC
CCCCCCCCCC
..........
..........
..........
..........
..........
CC.....CCC
CCCCCCCCCC
CCCCCCCCCC

この盤面では,左端から右端への道がただ一通りに定まらない.左から右へ直進するルートと,一度右下に移動した後に右上に移動するルートがある.提出した場合, Wrong Answer と判定され,点は得られない.


出力例4

CCCCCCCCCC
..........
..........
..........
.C........
..........
..........
.C........
..........
..........

この盤面では,左端から右端への道が存在しない.侵入者はCのマスにも立ち入れず, 10 \times 10 の空間の外に出ることもできない点に注意せよ.提出した場合, Wrong Answer と判定され,点は得られない.


また、全ての出力例に対する、鎖頭による攻撃範囲をXで埋めた盤面は以下の通りである.
CCCCCCCCCC
CCCCCCCCCC
XXXXXXXXXX
XXXXXXXXXX
..........
XXXXXXXXXX
XXXXXXXXXX
CCCCCCCCCC
CCCCCCCCCC
CCCCCCCCCC
CCCCCXCXX.
CCCCXCXX.X
CCCXCXX.XX
CCXCXX.XXC
CXCXX.XXCX
XCXX.XXCXC
CXX.XXCXCC
XX.XXCXCCC
X.XXCXCCCC
.XXCXCCCCC
CCCCCCCCCC
CCCCCCCCCC
XXXXXXXXXX
XXXXXXXXXX
..........
XXXX.XXXXX
XXXXXXXXXX
CCXXXXXCCC
CCCCCCCCCC
CCCCCCCCCC
CCCCCCCCCC
XXXXXXXXXX
XXXXXXXXXX
XXX.......
XCXX......
XXXX......
XXXX......
XCXX......
XXX.......
.X.X......

Source Name

京都大学プログラミングコンテスト2015
C - 最短経路

Time Limit: 2 sec / Memory Limit: 256 MB

問題文

ある単純有向グラフにおける任意の二頂点間の最短距離に関する条件が与えられる. その条件を満たす有向グラフが存在するかどうか判定せよ.


入力

入力は以下の形式で標準入力から与えられる.

T
N_1
a_{11} ... a_{1N_1}
a_{21} ... a_{2N_1}
:
a_{N_1 1} ... a_{N_1 N_1}
:
:
N_T
a_{11} ... a_{1N_T}
a_{21} ... a_{2N_T}
:
a_{N_T 1} ... a_{N_T N_T}

入力は複数のテストケースからなる.1 行目には,テストケースの個数を表す整数 T ( 1 \leq T \leq 30) が与えられる.
続いて T 個のテストケースが順に与えられる.
t ( 1 \leq t \leq T ) 番目のテストケースでは,はじめの行にグラフの頂点数を表す整数 N_t ( 1 \leq N_t \leq 30)が与えられる.
続く N_t 行にはそれぞれ N_t 個の整数が空白区切りで与えられ, i 行目の j 番目の整数 a_{ij} (1 \leq i,j \leq N_t, -1 \leq a_{ij} \leq 10000 )が -1の場合,頂点 i から頂点 j への経路が存在しないことを表し,そうでない場合は頂点 i から頂点 j への最短距離が a_{ij} であることを表す.

出力

制約を満たす有向グラフが存在する場合にはYES, しない場合にはNOを出力せよ.


入力例

4
3
0 2 3
4 0 1
3 2 0
3
0 2 4
4 0 1
3 2 0
2
0 -1
-1 0
2
0 -1
-1 1

出力例

YES
NO
YES
NO

Source Name

京都大学プログラミングコンテスト2015
D - 高橋君の旅行

Time Limit: 2 sec / Memory Limit: 256 MB

問題文

高橋君はハイカラシティを旅している. ハイカラシティは N+1 個の街からなる. それらの街を 街 1, 街 2, ..., 街 N+1 と呼ぶことにする.

高橋君は N 日間の旅の計画をたてることにした. 高橋君の 1 日目のはじめの所持金は 0 であり,街 1 にいる. i ( i = 1, ..., N ) 日目には以下のいずれかの行動を行う.

  • 今いる 街 k から街 k+1 に移動する.このとき所持金は A_k 変化する.
  • 今いる 街 k に滞在する.このとき所持金は B_k 変化する.

高橋君は以下を満たすような旅の計画を立てることにした.

  • i ( i = 1, ..., N ) 日目の終わりに所持金が負にならない
  • N 日目の終わりの所持金が最大となる

このような旅の N 日目の終わりの所持金を求めて出力せよ.


入力

入力は以下の形式で標準入力から与えられる.

N
A_1 A_2 ... A_N
B_1 B_2 ... B_N
  • 1 行目には 整数 N ( 2 \leq N \leq 10^5 ) が与えられる.
  • 2 行目には N 個の整数が空白区切りで与えられる. i 個目の整数は A_i ( -10^9 \leq A_i \leq 10^9 ) である.
  • 3 行目には N 個の整数が空白区切りで与えられる. i 個目の整数は B_i ( 0 \leq B_i \leq 10^9 ) である.

出力

高橋君が計画する旅の N 日目の終わりの所持金を出力せよ.

部分点

以下の制約を満たすデータセットに全て正解した場合は 3 点の部分点が与えられる.

  • N \leq 10^2


入力例1

3
-1 -1 -1
1 0 0

出力例1

3

すべての日で街 1 に滞在すると,終わりの所持金が最大となる.


入力例2

3
-1 -1 -1
1 10 0

出力例2

10

1 日目は街 1 に滞在,2 日目は街 2 に移動,3 日目は街 2 に滞在 ,とすると終わりの所持金が最大となる.


入力例3

3
-1 10 10
0 10 100

出力例3

0

1 から移動できず,終わりの所持金は 0 である.


入力例4

12
1 2 1 1 4 2 3 1 0 6 6 1
0 0 1 1 1 2 1 3 0 0 1 1

出力例4

30

Source Name

京都大学プログラミングコンテスト2015
E - マッサージチェア2015

Time Limit: 2 sec / Memory Limit: 256 MB

問題文

去年のKUPCでマッサージチェアに座った三人の学生は今年, H \times W の長方形状の談話室でマッサージチェアに座っている.
三人は人が近くにいるとリラックスできないので,以下の条件を満たすようにマッサージチェアを動かすことにした.

  • マッサージチェアを二次元平面上の点 A,B,C とみなす.
  • マッサージチェアはすべて談話室内に存在する.
  • min(AB, BC, CA) を最大化する.
このように動かした時のマッサージチェア間の距離の最小値を出力せよ.


入力

入力は以下の形式で標準入力から与えられる.

T
H_1 W_1
:
H_T W_T
  • 入力は複数のテストケースからなる. 1 行目にテストケースの数を表す整数 T ( 1 \leq T \leq 1000 ) が与えられる.
  • 続く T 行に談話室の大きさを表す整数 H_i, W_i ( 1 \leq H_i, W_i \leq 1000 ) が与えられる.

出力

出力は T 行からなる. i 行目の出力は, i 個目のテストケースに対する答えである.
小数点以下何桁でも出力して構わないが,絶対誤差が 10-6 未満になっていなければならない.


入力例

5
1 5
1 4
1 3
1 2
1 1

出力例

2.69258240356725201564
2.23606797749978969641
1.80277563773199464656
1.41421356237309504876
1.03527618041008324327

Source Name

京都大学プログラミングコンテスト2015
F - 逆ポーランド記法

Time Limit: 2 sec / Memory Limit: 256 MB

問題文

数式を表す記法に 逆ポーランド記法 がある. 本問題では, 1桁の整数 ( 0 から 9 ) や, 二項演算子 (加算 + , 減算 - , 乗算 * ) をトークンと呼び,トークンを連結した文字列で逆ポーランド記法の式を表す.
例えば, 逆ポーランド記法の式は 32-1+ のように書き,これは中置記法で書くと (3-2)+1 で計算結果は 2 である.
逆ポーランド記法の式を計算するための,関数のプログラムの擬似コードを次のように書いた.

calc(s)
{
    データ構造Xを空に初期化する

    for (i in [0 .. |s|-1])
    {
        if (s[i]は数である)
        {
            X.push(s[i])
        }
        else
        {
            r = X.pop()
            l = X.pop()
            lとrを演算子s[i]で計算した結果をaとする
            X.push(a)
        }
    }

    ans = X.pop()
    return ans
}
入力の s は逆ポーランド記法の式を表す文字列で, s[i]i+1 番目 (0 \leq i \leq |s|-1) のトークンを意味する.
lr を演算子 s[i] で計算した結果を a とする」 とは, lを左の被演算子, rを右の被演算子として 演算子 s[i] によって加算・減算・乗算を行うものである. 例えば s[i]- ならば a に中置記法で言うところの l - r を代入すると言う意味である.
データ構造 X にプッシュ・ポップする値は 0 から 9 の範囲とは限らないことに注意せよ.
データ構造 X が空の状態でポップするとプログラムはエラーを出して停止し,計算の出力は得られない.

コード中のデータ構造 X がスタックならばこの関数は逆ポーランド記法の式を正しく計算するが,誤ってキューで作ってしまい正しい計算をすることができない. そこであなたは,入力する式を並び替えてキューで作ったプログラムに正しい答えを出力させることにした.

X をスタックで作ったコードをSプログラム, X をキューで作ったコードをQプログラムと呼ぶことにする.
逆ポーランド記法の式 A が与えられるので,次の条件を満たすような B を求めて出力せよ.

  • BA の並び替えである
  • Qプログラムの入力に B を与えた時にQプログラムはエラーを出さない
  • Sプログラムの入力に A を与えた時の出力とQプログラムの入力に B を与えた時の出力は等しい


入力

入力は逆ポーランド記法の式を表す文字列 A の1行からなる.
A
  • 1 \leq |A| \leq 100
  • 文字列 A0123456789+-* からなる文字列である
  • 文字列 A は,正しい逆ポーランド記法の式である

出力

問題の条件を満たす文字列 Bを1行で出力せよ. そのような Bが複数ある場合はどれか一つ出力せよ.
B

入力例1

54-

出力例1

45-

入力 54- に対する正しい出力は 45- のただ一つだけである.

入力例2

321+-

出力例2

12+3-

入力 321+- をSプログラムに与えた時の計算を中置記法で書くと 3-(2+1) であり,Sプログラムの出力は 0 である.

入力例3

2

出力例3

2

数ひとつだけの文字列も正しい逆ポーランド記法の式である.


Source Name

京都大学プログラミングコンテスト2015
G - ケンドー

Time Limit: 2 sec / Memory Limit: 256 MB

問題文

キョートシティーではケンドーとよばれるスポーツが流行している.

ケンドーとは,N 人で構成される2つのチームが対戦するスポーツである. ケンドーに参加する人はワザマエとよばれる整数値を持っている.

ケンドーは以下のように行われる.

  • まず,それぞれのチームは,順番を決めて一列に整列する.
  • 次に,N 回のイッキウチが順番に行われる.
  • i ( 1 \leq i \leq N ) 回目のイッキウチは, それぞれのチームの i 番目に並んでいる人同士で行われれる.
  • イッキウチでは,ワザマエの小さい人が ケジメ されてしまう.対戦者のワザマエが同じ場合は引き分けとなり,どちらも ケジメ されない.

高橋君のチームは青木君のチームとケンドーを行おうとしている. 高橋君のチームの順番はすでに決定しようとしていたが 直前のスパイ活動により青木君のチームの順番がワザマエの小さい順に並んでいること, またそのワザマエの値を入手することができた. そこで,高橋君は自分のチームの順番を入れ替えることで, どのイッキウチでも自分のチームのメンバーが ケジメ されてしまわないようにしようと考えた.

様々な事情により,チームの順番は 隣接する 二人を選んで順番を交換することでのみ行うことができる. 対戦までは時間がないため,なるべく少ない交換回数でどの自分のチームのメンバーも ケジメ されてしまわないように並べ替えたい. そこで,あなたにはその交換回数を求めて出力してもらいたい. ただし,どのように交換しても自分のチームのメンバーの誰かが ケジメ されてしまうならば -1 を出力せよ.

入力

入力は以下の形式で標準入力から与えられる.

N
A_1 A_2 ... A_N
B_1 B_2 ... B_N
  • 1 行目には 整数 N ( 1 \leq N \leq 10^5 ) が与えられる.
  • 2 行目には N 個の整数 A_i ( 1 \leq i \leq N ) が空白区切りで与えられる.A_i ( 0 \leq A_i \leq 10^9 ) は 高橋君のチームの i 番目の人のワザマエを表す.
  • 3 行目には N 個の整数 B_i ( 1 \leq i \leq N ) が空白区切りで与えられる.B_i ( 0 \leq B_i \leq 10^9 ) は 青木君のチームの i 番目の人のワザマエを表す.
  • B_i \leq B_{i+1} ( 1 \leq i \leq N-1 ) が成り立つ.

出力

条件を満たすために必要な,最小の交換回数を 1 行で出力せよ. ただし,どのように交換しても条件を満たすことができないならば -1 を出力せよ.

部分点

以下の制約を満たすデータセットに全て正解した場合は 3 点の部分点が与えられる.

  • N \leq 10^3


入力例1

3
6 2 4
1 3 5

出力例1

2

初めにウデマエ 2 の人とウデマエ 6 の人を入れ替え, 次にウデマエ 6 の人とウデマエ 4 の人を入れ替える. このとき,ウデマエの順番は 2, 4, 6 となり,どのメンバーも ケジメ されなくなる.


入力例2

3
7 2 6
1 3 5

出力例2

1

ウデマエ 2 の人とウデマエ 7 の人を入れ替える. このとき,ウデマエの順番は 2, 7, 6 となり,どのメンバーも ケジメ されなくなる.


入力例3

3
8 8 8
2 7 9

出力例3

-1

どのように順番を並び替えても,最後の相手に ケジメ されてしまう.


Source Name

京都大学プログラミングコンテスト2015
H - Bit Count

Time Limit: 2 sec / Memory Limit: 256 MB

問題文

正整数 X を二進数で表したときに出現する 1 の個数を, X のビットカウントという.

与えられる正整数 N について, XX + N のビットカウントが等しくなるような正整数 X は存在するだろうか?

存在するならばその最小値を,存在しないなら -1 を出力せよ.


入力

入力は以下の形式で標準入力から与えられる.

T
N_1
:
N_T
  • テストケースの数は T ( 1 \leq T \leq 100 ) であり, i ( 1 \leq i \leq T ) 番目のテストケースは N_i ( 1 \leq N_i \leq 10^{16} ) である.
  • 入力値はすべて整数である.
  • 各々の出力の値はそれぞれ 100 桁を越えないことが保証されている.

出力

出力は T 行からなる. i 行目の出力は, N_i についての答えである.


入力例

3
10
20
30

出力例

10
20
2

Source Name

京都大学プログラミングコンテスト2015
I - ハウスシャッフル

Time Limit: 2 sec / Memory Limit: 256 MB

16:38 入力例の三番目のケースに誤りがありましたので,修正しました.

問題文

ヘンゼルはビスケット,キャンディ,マシュマロの絵の書かれたタイルを使って平面上にお菓子の家を作る遊びをしている.

そこでグレーテルが,お菓子の家を使ったゲームを提案した.

ゲームの内容は以下のとおりである.

  • まず,グレーテルがお菓子の家の大きさ N を指定する
  • 次に,ヘンゼルは一辺の長さ N の正三角形状にタイルを並べ, お菓子の家を作り,下の図のように座標をつける.
    このとき,最下段はビスケットのタイルで土台を作り, それ以外の段はキャンディとマシュマロのタイルで構成する.
  • グレーテルは,1 から N までがそれぞれ一度ずつ出現する 順列 σ を用意する.順列 σi 番目を σ_i で表すとする.
    なお,この順列 σ はヘンゼルには知られないようにする.
  • グレーテルは,その順列 σ から,以下の規則にしたがってお菓子の家をシャッフルする.
    ただし,シャッフルする前の座標 (i, j) の位置のタイルを a[i,j] , シャッフルした後の座標 (i, j) の位置のタイルを b[i,j] として表すものとする.
    • σ_i < σ_j のとき,b[i, j] = a[σ_j, σ_i]
    • σ_i ≥ σ_j のとき,b[i, j] = a[σ_i, σ_j]
  • ヘンゼルはシャッフルされたお菓子の絵を見て,順列 σ の内容を推測する.
    推測通りであれば,ヘンゼルの勝ち,間違っていればグレーテルの勝ちである.
以下は,N = 7 のときのお菓子の絵の例とその座標である.

以上のゲームを複数回行う. この問題の目的は,ヘンゼル役のAIプログラムを作成し, ジャッジ側の用意したグレーテル役のAIプログラムと対戦をして, 全てのゲームに勝つことである.


入出力

初めの入力は以下の一行のみで与えられる.

N

N (6 \leq N \leq 200) はお菓子の家の大きさを表す整数である.

この入力の後に,解答プログラムはお菓子の家を表す文字列を, マシュマロを o ,キャンディを @ , ビスケットを # として出力せよ. お菓子の家の上から i 段目を,長さ i の文字列 s_i として以下の形式で出力すること. 各行の先頭には空白を入れず横詰めで出力し,末尾には改行を出力せよ.

s_1
:
s_N

次に,シャッフル後のお菓子の家を表す文字列が同じ形式で与えられる. その後,順列 σ を空白区切りで以下のような形式で出力すること. 出力の後には改行を出力せよ.

σ_1 ... σ_N

この後,すぐに次のゲームがはじまり, 次のゲームのお菓子の家の大きさを表す整数が入力として与えられる. 全てのゲームが終了すると,お菓子の家の大きさを表す整数の代わりに 0 が入力として与えられるので,それを受け取ったら即座にプログラムを終了すること. なお,ひとつの入力で行われるゲームの回数は多くとも 10 回である.

各出力の後には,出力をフラッシュする必要があることに注意せよ.例えば C/C++ では

scanf("%d", &N);

としてお菓子の家のサイズNを受け取り, これに対して文字列s

printf("%s\n", s); fflush(stdout);

と出力すればよい. グレーテル役のAIプログラムから与えられる入力は最後まで受け取ること.受け取らなかった場合,Time Limit Exceeded の結果が得られることがあるため,注意すること.

部分点

以下の制約を満たすデータセットに全て正解した場合は 3 点の部分点が与えられる.

  • N = 6


入出力例

以下の入力例では N = 4 の場合について示しているが,このような入力は与えられないことに注意せよ.

手番 プログラムの出力 プログラムへの入力 説明
グレーテル 4 お菓子の家のサイズの指定
ヘンゼル @
o@
@oo
####
お菓子の家の作成
グレーテル @
o@
@oo
####
σを元にシャッフル
ヘンゼル 2 1 4 3 σの出力
グレーテル 4 お菓子の家のサイズの指定
ヘンゼル @
o@
@oo
####
お菓子の家の作成
グレーテル @
o@
@oo
####
σを元にシャッフル
ヘンゼル 1 2 3 4 σの出力
グレーテル 4 お菓子の家のサイズの指定
ヘンゼル @
o@
oo@
####
お菓子の家の作成
グレーテル @
@o
@oo
####
σを元にシャッフル
ヘンゼル 4 3 2 1 σの出力
グレーテル 0 全てのゲームが終了


Source Name

京都大学プログラミングコンテスト2015
J - MODクエリ

Time Limit: 5 sec / Memory Limit: 256 MB

問題文

頂点数 n の木があり,頂点 i (i = 1, ..., n) には正の整数 a_i が書かれている. q個の質問に答えよ.

各質問は3つの整数からなり, j 番目の質問は x_j, v_j, w_j で与えられる.
木の頂点 v_j から w_j への最短のパスの頂点に書かれている数 a_i で, x_j を順番に割った余りを出力せよ. 言い換えると,v_j から w_j への最短パスが p_1, ..., p_k (頂点数 k , p_1 = v_j, p_k = w_j ) であるとき, ((...((x_j % a_{p_1}) % a_{p_2}) ...) % a_{p_{k-1}} ) % a_{p_k} を出力せよ.

ただし x % yxy で割った余りを取る演算とする.


入力

1行目は数列の長さ n と質問の数 q が与えられる. 2行目には数列 a を表す n 個の正整数が空白区切りで与えられる. 続く n-1 行の各行には木の辺の端点 b_i, c_i が空白区切りで与えられる. 続く q 行には各質問が与えられる. 各質問は,3つの整数 x_j, v_j, w_j が空白区切りで与えられる.
n q
a_1 ... a_n
b_1 c_1
:
b_{n-1} c_{n-1}
x_1 v_1  w_1
:
x_q v_q  w_q
  • 1 \leq n \leq 100000
  • 1 \leq q \leq 100000
  • 1 \leq a_i \leq 10^{9}
  • 1 \leq b_i, c_i \leq n
  • 0 \leq x_j \leq 10^{9}
  • 1 \leq v_j, w_j \leq n
  • 入力値はすべて整数である
  • 与えられるグラフは木である

出力

出力は q 行からなる. j 行目には j 個目の質問に対する答えを1つの整数で出力せよ.

部分点

以下の制約を満たすデータセットに全て正解した場合は 30 点の部分点が与えられる.

  • 全ての i (1 \leq i \leq n-1) について, b_i = i, c_i = i+1 ,つまりグラフはパスである
  • 全ての j (1 \leq j \leq q) について, v_j \leq w_j である


入力例1

5 2
8 6 4 3 2
1 2
2 3
3 4
4 5
15 1 5
15 2 5

出力例1

1
0
グラフはパスの構造をしている. 1個目の質問について, 15 % 8 = 7, 7 % 6 = 1, 1 % 4 = 1, 1 % 3 = 1, 1 % 2 = 1 で,答は 1 である. 2個目の質問について, 15 % 6 = 3, 3 % 4 = 3, 3 % 3 = 0, 0 % 2 = 0 で,答は 0 である.

入力例2

8 5
18 29 52 64 4 59 89 15
1 2
1 3
1 4
2 5
3 6
3 7
4 8
99 6 7
102 5 8
15 2 6
84 7 8
19 1 1

出力例2

40
2
15
14
1

Source Name

京都大学プログラミングコンテスト2015
K - SOULBLOCK

Time Limit: 5 sec / Memory Limit: 512 MB

問題文

あなたは以下のようなゲームを作成した.

  • ゲームフィールドは二次元平面とみなすことができる.プレーヤーは原点に存在する点であり,フィールド上には円形のオブジェクトがいくつか存在する.
  • それぞれのオブジェクトには価値が決められている.
  • オブジェクトは別の物体に衝突されるまで止まったままである.
  • プレーヤーはゲーム開始時に,好きな方向を一度だけ選ぶ.すると,プレーヤーは選んだ方向に直進し続ける.
  • プレーヤーが止まっているオブジェクトにぶつかった時,オブジェクトはプレーヤーと衝突した箇所でくっつき,以降はプレーヤーと同じ方向に動く.
  • 動いているオブジェクトが止まっているオブジェクトにぶつかった時,オブジェクト同士は衝突した箇所でくっつき,以降はプレーヤーと同じ方向に動く.
  • 最終的に,プレーヤーと(直接的、あるいは間接的に)つながっているオブジェクトの価値の総和がプレーヤーのスコアとなる.

あなたはこのゲームを公開していたが、悪意のあるプレーヤーによって改造されてしまい,でたらめな方向にプレーヤーを発射するようになってしまった.
プレーヤーが一様にランダムな方向に飛び出すと仮定した時,プレーヤーが獲得するスコアの期待値を出力せよ.


入力

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

N
X_1 Y_1 R_1 W_1
:
X_N Y_N R_N W_N
  • 1 行目にオブジェクトの数を表す整数 N ( 1 \leq N \leq 2000 ) が与えられる.
  • 続く N 行にオブジェクトの中心座標を表す整数 X_i, Y_i ( -10^4 \leq X_i, Y_i \leq 10^4 ) , 半径を表す整数 R_i ( 1 \leq R_i \leq 10^4 ), 価値を表す整数 W_i ( 1 \leq W_i \leq 10^4 ) が与えられる.
  • ゲーム開始時にはプレーヤーはどのオブジェクトの内部または境界上にも存在しないことが保証される.
  • ゲーム開始時には異なる 2 つのオブジェクトは交差せず,接してもいないことが保証される.

出力

プレーヤーのスコアの期待値を 1 行に出力せよ.
小数点以下何桁でも出力して構わないが,絶対誤差または相対誤差が 10^{-6} 未満になっていなければならない.

部分点

以下の制約を満たすデータセットに全て正解した場合は 30 点の部分点が与えられる.

  • N \leq 100

入力例1

1
2 0 1 1

出力例1

0.166666666666667

入力例2

2
2 0 1 1
10 0 1 10

出力例2

0.970972899218329

入力例3

2
100 0 99 1
47 85 1 1

出力例3

0.584414703195711

Source Name

京都大学プログラミングコンテスト2015
L - コインゲーム

Time Limit: 2 sec / Memory Limit: 256 MB

問題文

テープに4001 個のセルが一列並んでおり、順に -2000 から 2000 の数が書かれている。 はじめに N 個のコインがそれぞれ 0 のセル以外の異なるセルに置かれている。 アリッサとベンはコインを1個づつ交互に動かすターン制ゲームを行う。

アリッサの先攻でゲームを始める。
自分のターンになったプレイヤーはテープに置かれているコインを1つ選ぶ。 そのコインをコインの置かれていない、別のセルに動かす。 ただしこのとき、 0 のセルに近づくように、 0 のセルを飛び越さないように動かさなければならない。
正確にはiのセルのコインを選んだ時は、次の条件を満たすjのセルに移動させることができる。

  • i \geq 1 のとき、 0 \leq j \leq i-1を満たし、jのセルにはコインが置かれていない
  • i \leq -1 のとき、 i+1 \leq j \leq 0を満たし、jのセルにはコインが置かれていない
先に 0 のセルにコインを移動させたプレイヤーが負けになり、もう一方のプレイヤーが勝ちとなる。
ゲームの最初の状態では、 0 のセルにはコインは置かれていないことを保証する。

ゲームの最初の状態として、N個のコインの置かれているセルA_1...A_Nが入力として与えられる。
アリッサがうまくプレイすればベンがどのように動かしても、アリッサが勝つ事ができるならば Alyssa と出力せよ。 そうでないならば Ben と出力せよ。


入力

N
A_1 ... A_N
1行目にはコインの数N が与えられる。 2行目にはコインの位置が空白区切りで与えられる。
  • 1 \leq N \leq 4000
  • -2000 \leq A_i \leq 2000
  • A_i0 ではない
  • 1 \leq i, j \leq Nについて、 i, j が異なるならば A_i, A_j は異なる

出力

name
Alyssa または Ben と出力する。

部分点

以下の制約を満たすデータセットに全て正解した場合は 30 点の部分点が与えられる.
  • 1 \leq N \leq 2

入力例1

1
5

出力例1

Alyssa

入力例2

2
-3 -4

出力例2

Ben

入力例3

4
-366 42 99 314

出力例3

Ben

Source Name

京都大学プログラミングコンテスト2015