AtCoderのARC
次のARCの問題へ
前のARCの問題へ
ARC145-B AB Game
C#のソース
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static string InputPattern = "InputX";
static List<string> GetInputList()
{
var WillReturn = new List<string>();
if (InputPattern == "Input1") {
WillReturn.Add("4 2 1");
//2
}
else if (InputPattern == "Input2") {
WillReturn.Add("27182818284 59045 23356");
//10752495144
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
static void Main()
{
List<string> InputList = GetInputList();
long[] wkArr = InputList[0].Split(' ').Select(pX => long.Parse(pX)).ToArray();
long N = wkArr[0];
long A = wkArr[1];
long B = wkArr[2];
if (N < A) {
Console.WriteLine(0);
return;
}
// 場合1 A <= B
if (A <= B) {
if (A <= N) {
Console.WriteLine(N - A + 1);
}
else {
Console.WriteLine(0);
}
return;
}
// 場合2 A > B
long Answer = 0;
long Rest = N - (A - 1);
long Syuuki = A;
long Cnt = Rest / Syuuki;
Answer += Cnt * B;
long Mod = Rest % Syuuki;
Answer += Math.Min(Mod, B);
Console.WriteLine(Answer);
}
}
解説
まず N < A の場合は、Aliceの負けです。
次に A <= B の場合は、
Aliceが取れるだけ取れば、Aliceの勝ちです。
A > B の場合は
(N,A,B) = (30 , 7 , 3) で
Aの勝敗を書いてみます。
01 02 03 04 05 06 07 08 09 10
負 負 負 負 負 負 勝 勝 勝 負
11 12 13 14 15 16 17 18 19 20
負 負 負 勝 勝 勝 負 負 負 負
21 22 23 24 25 26 27 28 29 30
勝 勝 勝 負 負 負 負 勝 勝 勝
Aの値を周期として、解くことができると分かります。