// ルールを拡張して正整数 N と K を使って以下のゲームを考える。 // 1. まず先攻のプレイヤーは 0 が与えられる。 // 2. そこから N 以上を宣言しないように(宣言したら負けになる)与えられた整数に 1~K のどれかの整数を加算したものを宣言し相手プレイヤーに渡す。 // 3. 勝負がつくまで代わり代わりに 2. を繰り返す。 // 実際にGrantと対戦し勝利してください。 // 最初にN,K が与えられ、 // あなたは、先攻後攻どちらかを自由に選べる。 // 時間の都合上、相手は、5ターン連続で勝てる見込みがないと判断すると諦めることになっている。 // 相手が諦めた場合、ゲームの状態には関係なくN以上(N+K以下の数)が宣言される。これは相手が諦めたものであると解釈し、あなたの勝ちとし、プログラムを終了すること // 入出力 // 最初の一行を読み込むと、ゲームのN,Kの値が得られる。 // N K // N,Kは整数で与えられる。 // 1≤N≤108 // 1≤K≤108 // 続いて、後攻を選択する場合のみ // 0 // を出力してください。 // 先攻の場合、何もしなくてよい。 // 自分のターンの時に、宣言する整数を1つ出力してください。 // A // これ以外の形式、ゲームのルールに違反する整数を宣言した場合の結果は、不定となる。 // 相手のターンの時は、相手の宣言した整数を標準入力として読み込む。形式は1つの整数である。ゲームのルール上あり得る整数値が渡される。 // B // 入力を読み込むと、自分のターンになり上記の繰り返しとする。 // この時に、N以上の入力を読み込んだとき、ただちにプログラムを終了してください。 // macのコンソールで実行は、下記コマンド // node filename 入力終了はCtrl+d // 入力用設定 // 多分node.jsが必須 var fs = require("fs"); function getInput() { return input = fs.readFileSync("/dev/stdin", "utf8"); } var line1 = getInput().split("\n")[0].split(" "); solve(parseInt(line1[0]),parseInt(line1[1])); function solve(n,k) { var countOfDead = n; var maxAdd = k; var current = 0; // countOfDead-1を取得した方が勝利と思われる // また、それを取得するには、countOfDead-1-maxAdd-1を取得できればよく、 // そこから公式化すると、countOfDead-1-(maxAdd+1)*nを取得した方が勝利 // 0より大きい中でcountOfDead-1-(maxAdd+1)*nの一番小さいものをプレイヤーが取得できる方を選べば勝てる var winNumber = countOfDead-1; var minWinNumber = winNumber % (maxAdd+1); var bFirstIsWin = true; if( minWinNumber!=0 && minWinNumber <= maxAdd ) { // 先攻ならば勝利 bFirstIsWin = true; current += minWinNumber; } else { // 後攻ならば勝利 bFirstIsWin = false; } //currentを出力 console.log(current); // あとは、ひたすらcountOfDead-1-(maxAdd+1)*nをキープ while(true) { // console.log("current="+current); var input = getInput(); var readNum=parseInt(input); // 多分、この場合入力に改行が含まれててもなんとかなる? if( countOfDead <= readNum) { // 勝利で終了 return; } // currentを更新 current = readNum; minWinNumber = (winNumber-current) % (maxAdd+1); current = current+minWinNumber; console.log(current); } }