Time Limit: 1 sec / Memory Limit: 256 MB
問題文
A+B Problem
問題文
2つの整数 A, B の和を求めるプログラムを書け.
A, B, A+B のいずれも 32 ビット符号付き整数に収まる.
入力
A_1 B_1 A_2 B_2 … 0 0入力は 100 個以下のケースからなる.各ケースは 1 行に A と B が空白区切りで書かれている.
A = B = 0 となる行で入力は終了であり,このケースは処理してはならない.
出力
各テストケースに対し,A+B の値を 1 行に出力せよ.
という A 問題が完成し,テスティングへ向かう JAPLJ. 疲れからか,不幸にも A+B Problem にバグを出してしまう.JAPLJ をかばいすべての責任を負ったきゅうりに対し, コンテストの主,大学院生丸橋に言い渡された示談の条件とは….
丸橋「誤答ソースコードを正しく直すんだよおう早くしろよ.」
あなたは,JAPLJ をかばいすべての責任を負ったきゅうりをかばいすべての責任を負った気持ちになって,JAPLJ の 3 つの誤答プログラムを撃墜できるテストケースをそれぞれ 1 つ出力しなければならない,
課題
A+B Problem (問題文参照)に対する以下の 3 つの C++ で記述された誤答プログラムに対し,それぞれを撃墜するテストケースを求めよ.
より正確に言えば,各誤答プログラムそれぞれに対し,A+B Problem の問題文・入力セクションの制約を満たすようなテストケースであって,誤答プログラムにそのケースを入力として与えた際に誤った回答を出力するようなものを出力するプログラムを書け.
回答 1 のソースコード:
#include <iostream> using namespace std; int main() { int A, B; while(cin >> A >> B, A+B!=0) { cout << A+B << endl; } return 0; }
回答 2 のソースコード:
#include <iostream> using namespace std; int myAbs(int n) { if(n < 0) return -n; else return n; } int main() { int A, B; while(cin >> A >> B, (A|B) != 0) { while(myAbs(A) >= 100000) { if(A > 0) { B += 100000; A -= 100000; } else { B -= 100000; A += 100000; } } if(A > 0) { for(int i=0; i<A; ++i) { B++; } } else { for(int i=0; i<-A; ++i) { B--; } } cout << B << endl; } return 0; }
回答 3 のソースコード:
#include<iostream> using namespace std; int C[3][32]; int main() { int A, B; while(cin >> A >> B, A!=0 || B!=0) { for(int i=0; i<32; ++i) { C[0][i] = (A >> i) & 1; C[1][i] = (B >> i) & 1; } for(int i=0; i<32; ++i) { if(C[0][i] + C[1][i] >= 2) { C[C[1][i-1] & 1][i+1]++; C[0][i]--; C[1][i]--; } C[2][i] = C[0][i] + C[1][i]; } int R = 0; for(int i=0; i<32; ++i) { R |= C[2][i] << i; } cout << R << endl; } return 0; }
入力
t
一行に整数 t のみが書かれており,これは t 番目の回答を撃墜するようなテストケースを求めることを表す.
出力
t 番目の回答を撃墜するようなテストケースを出力せよ.
出力のフォーマットは A+B Problem の入力フォーマットに従ったものでなければならない.
制限
すべての入力データは以下の制限を満たす.
- 1 \leq t \leq 3
採点基準
入力は全部で 3 つのテストケースからなり,
- t = 1 のケースに正解すれば 33 点
- t = 2 のケースに正解すれば 33 点
- t = 3 のケースに正解すれば 34 点
を与える.
入出力例
この問題には入出力例はない.
statement: kyuridenamida
Time Limit: 1 sec / Memory Limit: 256 MB
問題文
世界に誇る日本のおもちゃメーカーである Engrish 社は,業績不振から倒産の危機に追い込まれていました.一方今,世界ではお米を使った「ライスゲーム」が空前絶後の大ブームです!当然 Engrish 社はこのライスゲームブームを逃すまいと,日本での展開に力を入れることにしました.
このゲームを商品化し大量生産するには,とにかくお米がたくさん必要です!この案件の担当者は早速「モアモア・ライス・プリーズ!」と海外支社に連絡を入れたのですが…….
「なんてことだ…なんてことだ….」
数日後,本社に大量に届いたのはおびただしい量のシラミでした.恐るべき数のシラミを前に絶望に打ちひしがれる社員たち,そして絶句する担当者.なぜこんなことが起きてしまったのでしょうか.
答えは明白です.担当者が "More! More! Lice please!" などという言語道断な要求を行い,海外支社の社員は何の疑問も持たずシラミを大量発注したためです.つまり,担当者の発音がすべての惨劇(カタストロフィー)を生んだのです.全ての罪は担当者にあります.会社は悪くありません.
大量の負債を抱えて手に入れた大量のシラミ,もはやどうしていいのか誰にも分かりません.倒産待ったなしというこの状況において,このシラミをどうにか利益に繋げなければ確実に会社は倒産します.
そんなわけで,Engrish 社は Lice Game というものを考えだすことにしました.Lice Game はシラミをふんだんに用いたゲームで,楽しく生き物の生態を学ぶための子供向けゲームです.
このゲームは,グリッドに区切られた培養ガラスの上で行われます.グリッドの各セルはシラミがいるかいないかの 2 パターンあり,一日目には好きなセルにシラミを配置できます.その後,決められたルールに従って一日ごとに世代交代していきます.あるセルに明日シラミがいるかどうかは,そのセルに今日シラミがいるかどうかと,そのセルの周辺にシラミがいるセルが何個あるかによって決まります.ただし,あるセルの周辺とは,そのセルと共有点をもつ 8 つのセルのことを言います.具体的なルールは以下のようになります.
- 今日シラミがいるセルで,周辺にシラミのいるセルが 2 個か 3 個の場合,明日もこのセルにはシラミがいる.(それ以外の個数の場合,明日このセルにはシラミはいなくなる)
- 今日シラミがいないセルで,周辺にシラミのいるセルが 3 個の場合,明日このセルにはシラミがいる.(それ以外の個数の場合,明日もこのセルにはシラミはいないままである)
このゲームは当然のことながら大ブレイクし,Engrish 社は息を吹き返すことができました.
ところで,JAPLJ さんは潔癖症なので「シラミは汚いのでNG」としきりに生物の尊厳を傷つけるような発言をしています.友人である kyuridenamida 君は,シラミのことをもっとよく正しく知ってもらうために,誕生日プレゼントとして JAPLJ に Lice Game を送りつけようとしています.
Lice Game のやっかいなところは,適当にシラミを配置すると大量にシラミが増殖してしまう可能性があることです.そうなってしまえば,JAPLJ さんにとって恐怖そのものです.また,このゲームは捨てるとすぐバレてしまうので,捨てることは決して許されません.
JAPLJ さんはこの非常事態をいち早く察知し,対策を練っています.JAPLJ さんは,このゲームを捨てずに済む方法として「どの日のゲームの状態を見ても,シラミの配置がまったく同じになるように,一日目にシラミを配置する」という方法を考えました.
Lice Game には決まった匹数のシラミが付属しており,一日目に付属のシラミをグリッド上に配置しなければなりません.何匹のシラミが付属しているかはゲームが届くまで分からないので,JAPLJ さんは付属のシラミが何匹いても大丈夫なようにプログラムを書くことにしました.
JAPLJ さんの友人であるあなたには,このプログラムを書くのを手伝ってもらいたいのです.
課題
問題文中のLice Gameは,言うまでもなくコンウェイのライフゲームと同じルールである.したがって,無限に広いグリッド上でライフゲームを行うことを考える.
ライフゲームでは,無限に広いグリッドの各セルに対し「生」または「死」の 2 通りの状態を考える.はじめ,グリッド上にいくつか「生」のセルを決め,他は「死」のセルとする.あるセルの次の世代の状態は,今のそのセルの状態およびそれに隣接するセルの状態によって決定される.あるセルに隣接するセルとは,そのセルと共有点を持つような 8 個のセルのことである.具体的なルールは以下のようになる.
- 「生」のセルであって,隣接するセルのうち「生」のセルが 2 個または 3 個であるようなものは,次の世代でも「生」のセルである.(そうでなければ次世代では「死」のセルとなる)
- 「死」のセルであって,隣接するセルのうち「生」のセルがちょうど 3 個であるようなものは,次の世代で「生」のセルとなる.(そうでなければ次世代でも「死」のセルのままである)
Wikipedia におけるライフゲームの記事にも同様のルールが記載されているので参考にするとよい.
いくつかの「生」のセルの配置が 8 方向に連結であるとは,どの「生」のセルから他のどの「生」のセルに対しても,隣接する「生」のセルのみを辿ることで到達できることをいう.N 個の「生」のセルからなる 8 方向に連結な配置で,何世代経っても配置が全く同じである(すなわちはじめ「生」であった N 個のセルはずっと「生」のままであり,他のセルはずっと「死」のままである)ようなものをひとつ求めるプログラムを書け.
入力
N
N は「生」のセルの個数を表す.
出力
S_1 S_2 … S_N
1 \leq i \leq N に対し S_i は N 文字の文字列であり,各文字がセルの状態を表す.この N 個の文字列は無限に広いグリッドのうち N \times N の部分を抜き出してきたものと考える.
各 S_i は .
または #
の 2 種類の文字のみからなり,.
はそのセルが「死」の状態であること,#
はそのセルが「生」の状態であることを表す.S_i 中に含まれる文字 #
の総数は N でなければならない.また,文字 #
は 8 方向に連結な配置でなければならない.
ただし,条件を満たすような「生」のセルの配置が存在しない場合には代わりに -1 とだけ出力せよ.
制限
すべての入力データは以下の制限を満たす.
- 1 \leq N \leq 1,000
採点基準
- N \leq 8 を満たす入力データすべてに対し正答した場合 1 点を与える.
- すべての入力データに対し正答した場合はさらに 99 点を与える.
入力例1
4
出力例1
.... .##. .##. ....
入力例2
1
出力例2
-1
statement: kyuridenamida
Time Limit: 1 sec / Memory Limit: 256 MB
問題文
ロシアではいま睡眠が大ブームです.ロシアでは老若男女,誰もが睡眠をとります.ロシアでは睡眠をとらない人なんていません.
乗るしかない,このビッグウェーブに.寝ましょう!あなたも,わたしも,そこの君も,そのディスプレイの前で問題文を読んでいる人も!
おや,いまここには,寝たい人が N 人いるようですね.さっそく寝ましょう!この N 人がひとつのベッドで寝た日には,われわれはもうロシア中のヒーローですよ!
さあ寝ましょう寝ましょう,みなさん眠りましょう.ソビエトロシアでは,睡眠があなたをとる!
しかし,さすがに他人どうしが同じベッドで寝るというのは,いささかハードルが高いようですね?これは困った……と,思ったら,実はこの中には知り合いどうしである方々もいらっしゃる?それならば話は早い!知り合いどうしが隣り合って寝ればよいのです!
さらに都合の良いことに,知り合いどうしの関係はとても分かりやすい形をしている!なんと,いま適当に人を 0 番から N-1 番まで番号づけしたところ,i 番目の人は i-1 番目と i+1 番目の人とのみ知り合いである,となりました!ロシアンミラクル!!おっともちろん,-1 番目の人とは N-1 番目の人のこととして,N 番目の人とは 0 番目の人のこととしますよ.
少々おしゃべりが過ぎましたかね.さてさてそれではみなさんお待ちかねのことと思いますが,寝ましょう!さあ体をベッドに横たえて,目を閉じて深呼吸!気づけばもうあなたは眠りの中です!起きた時にはロシアのヒーローです!!お楽しみに!!!
えっ?それでもまだ寝方が分からないから怖い?ばっかお前……プログラムがついてるだろ.
課題
寝たい人が N 人いる.この N 人をひとつの長方形グリッドで表されるベッドに敷き詰めて寝かせたい.このとき,2 つの条件を満たす必要がある.
1 つめの条件はそれぞれの人の体勢についてである.それぞれの人はグリッド上のちょうど K 個のマス目によって表される.このとき,K 個のマスが一列に連結になっていなければ骨が折れてしまう.マスの集合が一列に連結であるとは,次のような条件を満たすように各マスに 1 から K までの番号をつけることができることを言う: どのマスも自分の番号との差が 1 であるようなマスとのみ隣り合う.また,2 つのマスが隣り合っているとは,それらのマスが辺を共有していることを言う.
次に示すのは K = 5 のときの正しい寝る体勢の例である(人のいるマスを文字 X
で表し,そうでないマスを文字 .
で表す):
XXX XX. ..X .XX ..X ..X
次に示すのは K = 5 のときに正しくない寝る体勢の例である:
XXX XXX XX. .XX X.. .X. ... .X. .X.
1 つ目の例は一列に連結となるようにマスを番号づけることができない.2 つ目の例は 5 つのマスが連結でない.3 つ目の例はマスが 4 つしかない.
2 つめの条件は人どうしが隣り合う関係についてである.N 人の人には 0 番から N-1 番までの番号がつけられており,i 番目の人は i-1 番目の人と i+1 番目の人とのみ隣り合っていなければならない.ここで -1 番目の人とは N-1 番目の人とし,N 番目の人とは 0 番目の人であるとする.また,2 人の人が隣り合っているとは,それぞれの人を表すマスであって隣り合っているようなものが存在することを言う.
次に示すのは K = 5 のときに隣り合っている 2 人の寝方の例である(1人目のいるマスを文字 X
で表し,2人目のいるマスを文字 Y
で表し,そうでないマスを文字 .
で表す):
XXX XXXXX YYX Y.... .YX YY... .YY .YY..
次に示すのは K = 5 のときに隣り合っていない 2 人の寝方の例である:
XXX XXXXX ..X ..... Y.X YYY.. YY. ..Y.. .YY ..Y..
ベッドを表す長方形グリッドの横幅と縦幅は自由に決めて良いが,グリッドのマス数は 100,000 を超えてはいけない.そのもとで,上に述べた 2 条件を満たすような N 人の寝方を 1 つ求めよ.もちろん,あるマスに同時に 2 人の人がいることはできない.
入力
N K
N は寝たい人の人数を表し,K はベッド上で 1 人の人が占めるマスの個数を表す.
出力
W H B_1 B_2 ... B_H
W と H はそれぞれベッドを表す長方形グリッドの横幅と縦幅を表す.W \times H \leq 10^5 を満たさなくてはならない.1 \leq i \leq H に対し B_i は W 文字の文字列であり,ベッドを表す長方形グリッドの i 行目を表す.B_i の各文字はひとつのマスに対応し,文字の種類は次のようにして定める:
- どの人もいない空のマスは文字
.
- x 番目の人がいるマスは
- 0 \leq x < 26 のときは x + 1 番目の英大文字
- 26 \leq x < 52 のときは x - 26 + 1 番目の英小文字
ただし,課題中の条件を満たすような寝方がひとつも存在しない場合は -1 とだけ出力せよ.
制限
すべての入力データは以下の制限を満たす.
- 2 \leq N \leq 52
- 1 \leq K \leq 52
採点基準
- すべての入力データに対し,課題中の条件を満たすような出力をした場合は 1 点を与える.
- 上に加え,すべての入力データに対し出力に含まれる文字
.
の個数が N + K 以下である場合にはさらに 99 点を与える.
注意: この問題では「すべての入力データに対し,条件を満たすような出力をした」場合を「Accepted」として扱います.従って,提出した結果がAC
であっても点数が 1 点である可能性があります.
入力例
4 4
出力例
5 4 BB.A. BAAA. B.DDD CCCCD
statement: JAPLJ
Time Limit: 1 sec / Memory Limit: 256 MB
問題文
output checker に不備が見つかったので修正します。修正が終わり次第 rejudge をかけます!!!!!ゴメンナサイ!!!!!!!
rejudge 終了しました許してください何でもしますから
私はちょうど他流試合でもする人のように K を注意して見ていたのです。私は、私の眼、私の心、私の身体、すべて私という名の付くものを五分の隙間もないように用意して、 K に向ったのです。罪のない K は穴だらけというよりむしろ明け放しと評するのが適当なくらいに無用心でした。私は彼自身の手から、彼の保管している要塞の地図を受け取って、彼の眼の前でゆっくりそれを眺める事ができたも同じでした。
K が理想と現実の間に彷徨してふらふらしているのを発見した私は、ただ一打で彼を倒す事ができるだろうという点にばかり眼を着けました。そうしてすぐ彼の虚に付け込んだのです。私は彼に向って急に厳粛な改まった態度を示し出しました。無論策略からですが、その態度に相応するくらいな緊張した気分もあったのですから、自分に滑稽だの羞恥だのを感ずる余裕はありませんでした。私はまず「精神的に向上心のないものは馬鹿だ」といい放ちました。これは二人で房州を旅行している際、 K が私に向って使った言葉です。私は彼の使った通りを、彼と同じような口調で、再び彼に投げ返したのです。しかし決して復讐ではありません。私は復讐以上に残酷な意味をもっていたという事を自白します。私はその一言で K の前に横たわる恋の行手を塞ごうとしたのです。
K は真宗寺に生れた男でした。しかし彼の傾向は中学時代から決して生家の宗旨に近いものではなかったのです。教義上の区別をよく知らない私が、こんな事をいう資格に乏しいのは承知していますが、私はただ男女に関係した点についてのみ、そう認めていたのです。 K は昔から精進という言葉が好きでした。私はその言葉の中に、禁欲という意味も籠っているのだろうと解釈していました。しかし後で実際を聞いて見ると、それよりもまだ厳重な意味が含まれているので、私は驚きました。道のためにはすべてを犠牲にすべきものだというのが彼の第一信条なのですから、摂欲や禁欲は無論、たとい欲を離れた恋そのものでも道の妨害になるのです。 K が自活生活をしている時分に、私はよく彼から彼の主張を聞かされたのでした。その頃からお嬢さんを思っていた私は、勢いどうしても彼に反対しなければならなかったのです。私が反対すると、彼はいつでも気の毒そうな顔をしました。そこには同情よりも侮蔑の方が余計に現われていました。
こういう過去を二人の間に通り抜けて来ているのですから、精神的に向上心のないものは馬鹿だという言葉は、 K に取って痛いに違いなかったのです。しかし前にもいった通り、私はこの一言で、彼が折角積み上げた過去を蹴散らしたつもりではありません。かえってそれを今まで通り積み重ねて行かせようとしたのです。それが道に達しようが、天に届こうが、私は構いません。私はただ K が急に生活の方向を転換して、私の利害と衝突するのを恐れたのです。要するに私の言葉は単なる利己心の発現でした。
「精神的に向上心のないものは、馬鹿だ」
私は二度同じ言葉を繰り返しました。そうして、その言葉が K の上にどう影響するかを見詰めていました。
「馬鹿だ」とやがて K が答えました。「僕は馬鹿だ」
K はぴたりとそこへ立ち留まったまま動きません。彼は地面の上を見詰めています。私は思わずぎょっとしました。私には K がその刹那に居直り強盗のごとく感ぜられたのです。しかしそれにしては彼の声がいかにも力に乏しいという事に気が付きました。私は彼の眼遣いを参考にしたかったのですが、彼は最後まで私の顔を見ないのです。そうして、徐々とまた歩き出しました。
(夏目漱石『こころ』より引用, 強調は JAPLJ による)
精進という言葉を好み,道を何よりも大事にする K ……
うわぁ……,これは K-最短路ですね.間違いない.なんだこれは…….たまげたなあ.
課題
2 つの整数 K, L が与えられる.50 頂点以下の重み付き単純無向グラフであって,ある 2 点間を結ぶ経路のうち K 番目に短いものの長さがちょうど L となるようなものを 1 つ求めよ.
より詳細に,N 頂点の重み付き単純無向グラフを考える.このグラフの辺は異なる2点を結んでいなければならず,ある2点を結ぶような辺は1つしか存在してはいけない(自己ループや多重辺は許されない).また,それぞれの辺には正の整数の重みがついている必要がある.このグラフの頂点を 1 から N まで番号づけたときに,頂点 1 から頂点 N へ至る経路のうち K 番目に短いものの長さがちょうど L になっていればよい.
経路中では同じ辺を2回以上通ったり,同じ頂点を2回以上訪れたりしても構わない.また,最後だけでなく途中で頂点 N に一回以上訪れるような経路も考える.そのような経路すべてを長さ(これは通る辺の重みの総和である)の昇順に並べたときの K 番目の経路の長さを L にすることが目的である.
入力
K L
これは K 番目に短い経路の長さがちょうど L となるようなグラフを求めることを表す.
出力
N M A_1 B_1 C_1 A_2 B_2 C_2 … A_M B_M C_M
N はグラフの頂点数を,M はグラフの辺数を表す整数である.1 \leq N \leq 50 でなければならない.
続く M 行は各行が 1 つの辺を表す.1 \leq i \leq M に対し A_i, B_i, C_i は,頂点 A_i と頂点 B_i を結ぶ辺が存在し,その重みが C_i であることを表す.1 \leq A_i, B_i \leq N かつ A_i \neq B_i かつ 1 \leq C_i \leq 10^9 でなければならない.
出力されるグラフは単純でなければならず,頂点 1 から頂点 N へ至る K 番目の最短路の長さがちょうど L でなければならない.
ただし,そのようなグラフが 1 つも存在しない場合は -1 とだけ出力せよ.
制限
すべての入力データは以下の制限を満たす.
- 1 \leq K \leq 5000
- 1 \leq L \leq 10^9
採点基準
この問題の入力データは「ふつうのケース」「ちょっときわどいケース」「かなりきわどいケース」の3種類に分けられる.その3種類が具体的にどのようなケースかを明かすことはしない.この問題に対する点数は次のように決まる.
- 「ふつうのケース」にすべて正解すれば 1 点を与える.
- 上に加え「ちょっときわどいケース」にすべて正解すれば,さらに 3 点を与える.
- 上に加え「かなりきわどいケース」にすべて正解すれば,さらに 196 点を与える.
入力例1
3 8
出力例1
3 2 1 2 2 2 3 2
このグラフにおける頂点 1 から頂点 3 へ至る経路を短いものから 3 つ挙げると
- 1 → 2 → 3 と至る長さ 4 の経路
- 1 → 2 → 1 → 2 → 3 と至る長さ 8 の経路
- 1 → 2 → 3 → 2 → 3 と至る長さ 8 の経路
となる.2番目と3番目は長さが同じだが,この問題では長さだけが問題なのでどちらが先に来ても同じことである.また,同じ辺を2回以上通ったり,同じ頂点を2回以上訪れたり,途中で頂点 3 を訪れたりするような経路も考慮することに注意せよ.
入力例2
5000 1
出力例2
-1
statement: 夏目漱石, JAPLJ
Time Limit: 1 sec / Memory Limit: 256 MB
問題文
ぁぁ~初めまして!!! JAPLJ です!!!
今回初めてお誕生日コンテストにて参加させていただいた JAPLJ と申します♪
ひらがなで「じゃっぷる」カタカナで「ジャップル」です!!!
「排他的☆論理和っ!!」とはなんぞや?と JAPLJ なりに考えてみたのです!!!
ハテ、排他的とは!?ハテ、論理和とは!!?
答えは「ハイタテキロンリワ」
カタカナにしても逆さに読んでも、じゃっぷるには無理難題ものでした><!!!
グルグル~
ハッ!
きっとこういうことね☆キラーん!!!
課題
2 つの正整数 A,\, B に対し,それらのビットごとの排他的論理和 A XOR B を計算せよ.
上記問題に対する入力ファイルのフォーマットは次のようになっている.
T A_1 B_1 A_2 B_2 … A_T B_T
T はテストケース数を表し,続く T 行は各行がひとつのテストケースを表す.1 \leq i \leq T に対し A_i, B_i は i 番目のテストケースにおける A, B の値を表す.各テストケースにおける A, B の値は半角空白1文字で区切られており,それ以外にファイル中に半角空白は存在しない.また,改行文字は LF であり,A_T, B_T が書かれた行の末尾にも改行がある.入力ファイルの文字コードは ASCII である.
また,上記問題に対する入力はすべて次の制限を満たす.
- 1 \leq T \leq 200
- 1 \leq A_i \leq 10
- 1 \leq B_i \leq 10
上記問題に対する入力ファイルは全部で 11 個存在し,0 から 10 までの番号がつけられている.この11個の入力ファイルに対し正しい答を計算することがこの課題の目的である.
そのために必要なファイルはzip アーカイブでまとめてダウンロード可能である.この zip ファイルを解凍すると input0.data, input1.data, ..., input10.data という 11 個のファイルが出てくる.これらのファイル名につけられた番号は上記問題に対する入力ファイルの番号と対応している.
ページ下部にヒントが書かれている.解く際の参考とするとよい.
入力
t
t は課題セクション中に述べられた問題に対する入力ファイルの番号を表す.
出力
C_1 C_2 … C_T
T は課題セクション中に述べられた問題に対する t 番の入力ファイルにおける T の値でなければならず,1 \leq i \leq T に対し C_i はその入力ファイルにおける i 番目のテストケースの答になっていなければならない.
制限
すべての入力データは以下の制限を満たす.
- 0 \leq t \leq 10
採点基準
- t = 1, 2 を満たす入力データすべてに対し正答した場合 10 点を与える.
- t = 3, 4, 5, 6, 7, 8, 9, 10 を満たす入力データすべてに対し正答した場合 190 点を与える.
- t = 0 の入力データは採点基準とは関係がないことに注意せよ.
入力例
0
出力例
6 12 11 14 0 15 11 0 9 2 0 14 5 8 10 7 0 14 14 0
ヒント
- input0.data に対しては L = 2
- input1.data, input2.data に対しては L = 8
- input3.data, input4.data, ..., input10.data に対しては L = 128
なお, L の表す意味は本問題文中に記述がないがこれはミスではなく意図的な隠蔽であるので,この件に関しての質問に答えることはない.
statement: JAPLJ
Time Limit: 1 sec / Memory Limit: 256 MB
問題文
素数列に関する研究は,古来より多くの人々が取り組み,挫折してきたことで有名だ. おいらもその一人だ. おいらは今窮地に立たされている.
先日,素数だけを含む数列の一般項(生成式)を発見したという大口をたたいたものの,冷静に考えてみると全然そんなことはなく,気づいた時には後の祭り,公の場で発表することになってしまっていた!
正直,「穴があったら入りたい」という気持ちでいっぱいなんだけど,どうにか耐え凌がなければ未来はなさそうだ. そこでおいらは次のような作戦を考えた!
- 素数列は商業的にも非常に価値があるので,ただちにその生成式を公開することはできない.
- その数列の第 1 項目から第 100 項目までを公開する.
- すかさず,素数に関する奇妙な歌を歌って話を逸らし,質問はさせない.
うん!これなら世間様を納得させることができて,おいらの地位もますます向上するに違いない.
課題
f(1),\, f(2),\, …,\, f(100) の 100 個の値ができるだけ多くの異なる素数になるような一変数関数 f(n) を求めよ.
ただし,f の計算は 32 ビット符号付き整数型演算を行うことができるコンピューターが行うことから,f は以下の制約を満たさなければならない.
- 式は 変数 n, 定数, 加減乗除(+, -, *, /), 剰余(%),単項の + および - のみの要素からなる.
- 定数は 32 ビット符号付き整数に収まっている必要があり,n = 1,\, 2,\, …,\, 100 に対して f(n) の計算中に出てくるすべての値も32 ビット符号付き整数に収まっている必要がある.
注意:-5
は定数ではなく,単項演算子 - に定数 5 を適用した形として解釈される.したがって定数はすべて非負であり,その値はすべて 2147483647 以下でなければならない.すなわち,-2147483648
は不正な式である. - 式の評価順序は左結合で単項演算子が最も優先され,乗除と剰余がその次,加減が最後で,括弧があればそれが優先される.
- 割り算は整数除算で行われる.整数除算で得られる値は,代数的な商から小数部を切り捨てた値とする(たとえば, -7/3 = -2 である).
- 剰余については
(x / y) * y + x % y
の値がx
の値と等しくなるようにx % y
の値を定める(たとえば -7%3 = -1 である). - ゼロ除算が生じてはならない.
- 出力すべき数式は以下のBNF表記の <expr> シンボルから導出されるものでなければならず,余計なスペース等を含んではならない.
<expr> ::= <term> "+" <expr> | <term> "-" <expr> <term> ::= <fact> "*" <term> | <fact> "/" <term> | <fact> "%" <term> <fact> ::= "+" <fact> | "-" <fact> | "(" <expr> ")" | <number> | "n" <number> ::= <digit> | <digit> <number> <digit> ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
入力
この問題には入力はない.
出力
課題の制約を満たす f(n) の式を一行に出力せよ.
採点基準
出力された f に対し f(1),\, f(2),\, …,\, f(100) を計算し,含まれる相異なる素数の個数(これを P とする)と,その数式の長さ(これを L とする)によって得点が与えられる.ただし数式の長さとは出力文字列の文字数とする.
出力された f が課題の制約を満たしていないか,L > 2000 のときは得点は 0 点である.そうでない場合,以下に示した条件それぞれを満たすたびに対応した得点を与える.
- P \geq 87 (4点)
- P = 100 かつ L \leq 600 (5点)
- P = 100 かつ L \leq 300 (5点)
- P = 100 かつ L \leq 250 (6点)
- P = 100 かつ L \leq A (15点)
- P = 100 かつ L \leq B (15点)
- P = 100 かつ L \leq C (20点)
- P = 100 かつ L \leq D (230点)
- P = 100 かつ L \leq X (1点と賛辞)
- P = 100 かつ L < X (1点と名誉)
ただし X は JAPLJ と kyuridenamida が用意した解のうち最も短いものの長さ,A,\, B,\, C,\, D は秘密の定数で,次の式を満たす.- X < D < C < B < A < 250
- 250 - A \geq A - B = B - C > C - D > D - X
注意: この問題では「出力された f が課題の制約を満たしており,かつ L \leq 2000 の場合」を「Accepted」として扱います.従って,提出した結果がAC
であっても満点でない可能性があります.すなわち,特に次のような結果が返ってきた場合は以下のようなことがわかります:
- 提出した結果が
WA
のとき,出力された式 f が課題の制約に反するか,L > 2000 - 提出した結果が
AC
で,点数が 0 点のとき, f は課題の制約を満たし,かつ L \leq 2000 であるが P < 87
出力例1
57
グロタンディーク素数は素数ではない.そもそもこの式を n = 1, 2, …, 100 で評価しても 57 しか出てこないので無慈悲な 0 点である.
出力例2
2*n+1
3 は素数,5 は素数,7 も素数,…….よって奇数はすべて素数である.
そんなわけがなくてこの式は素数を 45 個しか生成しないので同じく無慈悲な 0 点である.
出力例3
-(n%2)
これもうわかんねえな
出力例4
123-45-67+89
ここで小町算をするのはやめろ
statement: kyuridenamida
Time Limit: 2 sec / Memory Limit: 256 MB
このコンテストで潰そうという気になってくれた方に挑戦していただければと思います.コンテスト準備をしている段階から,本当にこんな問題を出題するのが許されるのかと大いに悩んでおりましたが,せっかくのネタ性に溢れるコンテストなので思い切って出題してみた次第です.お楽しみ頂ければ幸いです.
問題文
くぅ〜疲れましたw これにてコンテスト準備終了です!
実は、ネタ問題を考えたらコンテストの話を持ちかけられたのが始まりでした
本当はボス問題のネタなかったのですが←
ご厚意を無駄にするわけには行かないので一発ネタで挑んでみた所存ですw
以下、writer達のみんなへのメッセジをどぞ
きゅうり「みんな、解いてくれてありがとう
ちょっとクソ問なところも見えちゃったけど・・・気にしないでね!」
JAPLJ「いやーありがと!
問題の面白さは二十分に伝わったかな?」
KyuR1「解いてくれたのは嬉しいけどちょっとペナルティが多いね・・・」
じゃっぷる「解いてくれてありがとな!
正直、問題文はほとんどがコピペ改変だよ!」
kyuridenamida「・・・ありがと」キュリ
では、
きゅうり、JAPLJ、KyuR1、じゃっぷる、kyuridenamida、高橋「皆さんありがとうございました!」
終
きゅうり、JAPLJ、KyuR1、じゃっぷる、kyuridenamida「って、なんで高橋くんが!?
改めまして、ありがとうございました!」
本当の本当に終わり
課題
1 桁の整数,括弧,四則演算(加算・減算・乗算・除算)のみからなる式が与えられるので,その計算結果を出力せよ.
入力
t W H B_1 B_2 … B_H
t は非負整数であり,0 番から順につけられているテストケースの番号を表す.
W, H はいずれも正の整数で入力の画像の横の大きさと縦の大きさを表す.
1 \leq i \leq H に対し B_i は .
と #
のみからなる W 文字の文字列であり,その j 文字目 (1 \leq j \leq W) は画像の上から i 行目,左から j 列目の画素を表す.対応する文字が .
のときその画素は白で,#
のときその画素は黒である.
出力
A
A は入力の画像の黒い画素によって表される式の計算結果である.
制限
- 全ての入力データで,H = 65かつ 1 \leq W \leq 9,000を満たす.
すべての入力データは以下のプロセスによって生成される.
- はじめに 1 桁の整数,括弧,四則演算のみからなる L 文字以下の式で,計算結果も計算途中に現れる値も 32 ビット符号付き整数型に収まるようなものを用意する(これはランダムに生成されるとは限らない).
また,割り算は整数除算で行われる.整数除算で得られる値は,代数的な商から小数部を切り捨てた値とする(たとえば, -7/3 = -2 である).
なお,-5
といった負数のリテラルや-(2+3)
や+1
といった単項演算子を含む式は存在しない. - 式に含まれる各文字に対応する画像を次のようにして生成する.
- フォント Courier Prime を用い,フォントサイズ64,太字で文字を描画した 2 値画像を作成する.
このようにして生成した画像と,それを.
と#
からなるテキストに変換したものをページ下部のヒントからダウンロード可能である. - 倍率 M (M \leq 1) を生成し,画像全体を M 倍に拡大(実質的に縮小)する.
- 縦方向の倍率 M_h (M_h \leq 1) と横方向の倍率 M_w (M_w \leq 1) を生成し,画像全体を縦方向に M_h 倍,横方向に M_w 倍に拡大する.
- 角度 R を生成し,画像全体を R 度回転させる.
- 2つのパラメタ S_x, S_y を生成し,このパラメタに基いて画像を歪める.具体的には座標 (x,\, y) にある画素を (x + S_{y}y,\, S_{x}x + y) へと移す変換を行う.
- フォント Courier Prime を用い,フォントサイズ64,太字で文字を描画した 2 値画像を作成する.
- 各文字に対応する画像を横に連結してひとつの画像を得る.このとき
- 横方向の位置については,隣り合う文字どうしがくっついてしまわないように,文字と文字の間には 10 画素ぶんの余白を設ける.
- 縦方向の位置については,画像全体の縦幅は拡大縮小・回転・歪みなどの操作を加える前のフォントの縦の大きさぶん用意し,そこにおさまる範囲でランダムに決められる.
- 最後に確率 P によって,画像の各画素について確率 P でその白黒を反転させる(ノイズを生成する).
ここで式の長さの上限 L およびノイズの確率 P は入力データごとに独立な値,さらに倍率 M,\, M_h,\, M_w, 角度 R, 歪みのパラメタ S_x,\, S_y は同じテストケース中でもそれぞれの文字によって独立に生成されることに注意せよ.
採点基準
この問題の入力データは 140 個あり,0 から始まる番号が各入力データにつけられている.これは入力セクションにおける t の値に対応する.また,以下では x \in [a,\, b] という記法を「x は a 以上 b 以下の実数の一様乱数によって生成する」の意味で用いる.
- 0 \leq t < 30 を満たす入力データの生成プロセスでは
- L = 3
- M \in [0.9,\, 1]
- M_h \in [0.9,\, 1],\, M_w \in [0.9,\, 1]
- R \in [-2,\, 2]
- S_x = 0,\, S_y = 0
- P = 0
- 30 \leq t < 90 を満たす入力データの生成プロセスでは
- L = 50
- M \in [0.9,\, 1]
- M_h \in [0.9,\, 1],\, M_w \in [0.9,\, 1]
- R \in [-10,\, 10]
- S_x \in [-0.1,\, 0.1],\, S_y \in [-0.1,\, 0.1]
- P = 0.05
- 90 \leq t < 140 を満たす入力データの生成プロセスでは
- L = 200
- M \in [0.9,\, 1]
- M_h \in [0.9,\, 1],\, M_w \in [0.9,\, 1]
- R \in [-15,\, 15]
- S_x \in [-0.1,\, 0.1],\, S_y \in [-0.1,\, 0.1]
- P = 0.05
得点は次のようにして決まる.
- 0 \leq t < 30 を満たす入力データ 1 つに正解するごとに 2 点を与える.
- 30 \leq t < 55 を満たす入力データ 1 つに正解するごとに 2 点を与える.
- 55 \leq t < 90 を満たす入力データ 1 つに正解するごとに 4 点を与える.
- 90 \leq t < 140 を満たす入力データ 1 つに正解するごとに 5 点を与える.
なお,30 \leq t < 55 を満たす入力データについては,その入力ファイルおよびそれぞれを可視化した PNG フォーマットの画像をダウンロード可能である: ここだよ.
入出力例
例として,次のような画像が入力される場合を考える.
この画像に対応する入力データを示す(サイズが大きいのでリンク先のファイルを参照,等幅フォントでフォントサイズを小さくすると分かりやすい).このデータのテストケース番号 999 はダミーである.
これに対しては 3 \times 3 - 4 を計算して
5
出力すればよい.
ヒント
フォントデータ
0123456789()+-*/
の 16 文字ぶんの 画像とテキスト形式のフォントデータをまとめた zip がリンクからダウンロード可能である.この zip ファイルを展開すると txt/ と png/ という 2 つのディレクトリがあり,それぞれ中にテキスト形式と画像(PNG形式)のフォントデータが入っている.
テキスト形式のフォントデータのフォーマットについては,本課題の入力フォーマットからテストケース番号 t を省いた形になっている.
埋め込み支援用テキスト
上記フォントデータをプログラム中に埋め込む際に使えるテキストがリンクからダウンロード可能である.適宜必要な加工をして埋め込みに用いるとよい.
注意: この埋め込みデータは約 44,000 バイトある.AtCoder で送信できるソースコードは UTF-8 で 60,000 文字以下なので,文字数制限に注意してプログラムを書くこと.
われわれの努力について
採点用に用いられるデータに対する特別な対応を行っていないプログラムで,採点用の 140 個のデータおよび同様の方法でランダム生成された 200 個ぐらいのデータに対してすべて正答するようなものが存在する(がんばりました).
statement: JAPLJ