結果

問題 No.257 N言っちゃダメゲーム (3)
ユーザー startcppstartcpp
提出日時 2015-07-31 23:27:42
言語 C++11
(gcc 13.3.0)
結果
AC  
実行時間 64 ms / 2,000 ms
コード長 1,465 bytes
コンパイル時間 678 ms
コンパイル使用メモリ 79,800 KB
実行使用メモリ 25,448 KB
平均クエリ数 3.70
最終ジャッジ日時 2024-07-16 20:57:59
合計ジャッジ時間 4,124 ms
ジャッジサーバーID
(参考情報)
judge1 / judge2
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 30
権限があれば一括ダウンロードができます

ソースコード

diff #

#include<iostream>
#include<string>
#include<algorithm>
#include<functional>
#include<vector>
#include<stack>
#include<queue>
#include<set>
#include<map>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
using namespace std;

/*
自分のターンに…

N-1…負け
N-K-1~N-2…N-1にできるので勝ち
N-K-2…N-1にされるので負け
N-2K-2~N-K-3…N-K-2にできるので勝ち
N-2K-3…N-K-2にされるので負け
…
一般に
・N-n(K+1)-1(nは非負整数)になったら負け。
・初期値がN-n(K+1)-1となる場合(すなわち、N % (K+1) == 1を満たすとき)、
順序を変更する必要がある。
・戦略としては、N-n(K+1)-1を常に作り続けること。
どうやって?

・入力値をinとし
in = N - n(K+1) - X
をみたすとする。このとき、
X + n(K+1) = N - in
を満たす。つまり
(N - in) % (K+1) == Xとなる。

今度は、
(N - in) % (K+1) == 1としたい!そのためには…
X == 0ならin + Kを出力
X == 1なら負け(だけど、それはあり得ない)
X > 1(実質X > 0)なら、in + X - 1を出力
すればよい。
*/

int n, k;

signed main() {
	cin >> n >> k;
	if (n % (k+1) == 1)
		cout << 0 << endl;
	else
		cout << (((n % (k+1))==0)? k : (n % (k+1)) - 1) << endl;
	
	int in;
	while (cin >> in) {
		if (in >= n)
			break;
		int X = (n - in) % (k+1);
		if (X == 0)
			cout << in + k << endl;
		else
			cout << in + X - 1 << endl;
	}
	return 0;
}
0