AtCoderのABC
次のABCの問題へ
前のABCの問題へ
ABC180-D Takahashi Unevolved
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 20 2 10");
//2
}
else if (InputPattern == "Input2") {
WillReturn.Add("1 1000000000000000000 10 1000000000");
//1000000007
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
static void Main()
{
List<string> InputList = GetInputList();
decimal[] wkArr = InputList[0].Split(' ').Select(pX => decimal.Parse(pX)).ToArray();
decimal X = wkArr[0];
decimal Y = wkArr[1];
decimal A = wkArr[2];
decimal B = wkArr[3];
// A倍する回数を全探索
decimal Answer = decimal.MinValue;
decimal ProdX = X;
for (decimal I = 0; I < int.MaxValue; I++) {
if (I > 0) {
ProdX *= A;
}
if (ProdX >= Y) break;
decimal Rest = Y - 1 - ProdX;
decimal ModVal = Rest % B;
decimal DivVal = (Rest - ModVal) / B;
Answer = Math.Max(Answer, I + DivVal);
}
Console.WriteLine(Answer);
}
}
解説
例えば、
足し算を2回
掛け算を3回
するのであれば、
先に掛け算を3回してから、足し算を2回するのが最適なので、
掛け算の回数を全探索してます。