using System; using System.Collections.Generic; using System.Linq; class Program { static string InputPattern = "Input4"; static List GetInputList() { var WillReturn = new List(); if (InputPattern == "Input1") { WillReturn.Add("50 80 120"); //130 //50円切手と80円切手を組み合わせて、ちょうど120円にすることはできません。 //この場合、50円切手と80円切手を1枚ずつ使って130円にするのが、 //120円以上での最少額になります。 } else if (InputPattern == "Input2") { WillReturn.Add("123 456 1"); //123 //必ずしも両方の種類の切手を使う必要はありません。 //この場合、額面の小さい123円の切手を1枚貼ることになります。 } else if (InputPattern == "Input3") { WillReturn.Add("1234 1688 10000"); //10000 //うまくすれば、ちょうど10000円にできるようです。 } else { string wkStr; while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr); } return WillReturn; } static void Main() { List InputList = GetInputList(); int[] wkArr = InputList[0].Split(' ').Select(X => int.Parse(X)).ToArray(); int A = wkArr[0]; int B = wkArr[1]; int T = wkArr[2]; //AかBの倍数なら、解が確定 if (T % A == 0 || T % B == 0) { Console.WriteLine(T); return; } int MinSumVal = int.MaxValue; int SumVal; //Aの切手だけを使う場合 SumVal = T + (A - T % A); if (MinSumVal > SumVal) MinSumVal = SumVal; //Bの切手だけを使う場合 SumVal = T + (B - T % B); if (MinSumVal > SumVal) MinSumVal = SumVal; //両方の切手を使う場合 //Yを固定してXを求める var ModASet = new HashSet(); for (int Y = 0; B * Y < T; Y++) { SumVal = B * Y; int RestVal = T - SumVal; int ModA = RestVal % A; if (ModA == 0) { Console.WriteLine(T); return; } //同じModが出たらBreak if (ModASet.Add(ModA) == false) break; SumVal = T + (A - ModA); if (MinSumVal > SumVal) MinSumVal = SumVal; } Console.WriteLine(MinSumVal); } }