AtCoderの企業コンテスト    次の企業コンテストの問題へ    前の企業コンテストの問題へ

第二回日本最強プログラマー学生選手権 C Max GCD 2


問題へのリンク


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("2 4");
            //2
        }
        else if (InputPattern == "Input2") {
            WillReturn.Add("199999 200000");
            //1
        }
        else if (InputPattern == "Input3") {
            WillReturn.Add("101 139");
            //34
        }
        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 A = wkArr[0];
        long B = wkArr[1];

        long Answer = 1;
        for (long I = 1; I <= B; I++) {
            long BaisuuCnt = DeriveBaisuuCnt(A, B, I);
            if (BaisuuCnt >= 2) {
                Answer = I;
            }
        }
        Console.WriteLine(Answer);
    }

    // 範囲の開始と終了と、数Aを指定して、Aの倍数が何個あるかを返す
    static long DeriveBaisuuCnt(long pSta, long pEnd, long pA)
    {
        long StaSyou = pSta / pA;
        if (pSta % pA > 0) {
            StaSyou++;
        }
        long EndSyou = pEnd / pA;
        return EndSyou - StaSyou + 1;
    }
}


解説

下記の考え方で、公約数の候補を全探索してます。

2を公約数に持つには、AからBの区間に、2の倍数が2個以上あればいいです。
3を公約数に持つには、AからBの区間に、3の倍数が2個以上あればいいです。
4を公約数に持つには、AからBの区間に、4の倍数が2個以上あればいいです。
5を公約数に持つには、AからBの区間に、5の倍数が2個以上あればいいです。
以下同様