結果

問題 No.894 二種類のバス
ユーザー mbanmban
提出日時 2019-09-27 21:55:50
言語 C#(csc)
(csc 3.9.0)
結果
AC  
実行時間 32 ms / 1,000 ms
コード長 5,174 bytes
コンパイル時間 1,241 ms
コンパイル使用メモリ 111,424 KB
実行使用メモリ 25,008 KB
最終ジャッジ日時 2023-10-25 03:26:04
合計ジャッジ時間 2,645 ms
ジャッジサーバーID
(参考情報)
judge12 / judge11
このコードへのチャレンジ(β)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 32 ms
24,996 KB
testcase_01 AC 31 ms
24,996 KB
testcase_02 AC 32 ms
24,996 KB
testcase_03 AC 31 ms
24,996 KB
testcase_04 AC 32 ms
24,996 KB
testcase_05 AC 32 ms
24,996 KB
testcase_06 AC 32 ms
24,996 KB
testcase_07 AC 31 ms
24,996 KB
testcase_08 AC 32 ms
24,996 KB
testcase_09 AC 32 ms
24,996 KB
testcase_10 AC 31 ms
24,992 KB
testcase_11 AC 31 ms
24,992 KB
testcase_12 AC 31 ms
24,992 KB
testcase_13 AC 31 ms
24,992 KB
testcase_14 AC 31 ms
24,992 KB
testcase_15 AC 31 ms
24,992 KB
testcase_16 AC 31 ms
25,008 KB
testcase_17 AC 30 ms
24,956 KB
testcase_18 AC 30 ms
24,956 KB
testcase_19 AC 31 ms
24,992 KB
権限があれば一括ダウンロードができます
コンパイルメッセージ
Microsoft (R) Visual C# Compiler version 3.9.0-6.21124.20 (db94f4cc)
Copyright (C) Microsoft Corporation. All rights reserved.

ソースコード

diff #

using System;
using System.Collections.Generic;
using System.Numerics;

public class Program
{
    private long T, A, B;

    public void Solve()
    {
        var sc = new Scanner();
        T = sc.NextLong();
        A = sc.NextLong();
        B = sc.NextLong();

        BigInteger lcm = (BigInteger) A * B / MathEx.GCD(A, B);

        BigInteger ans = 0;
        ans += (T + A - 1) / A;
        ans += (T + B - 1) / B;
        ans -= (T + lcm - 1) / lcm;
        Console.WriteLine(ans);
    }


    public static void Main(string[] args)
    {
        new Program().Solve();
    }
}

#region GCD LCM

/// <summary>
/// 様々な数学的関数の静的メソッドを提供します.
/// </summary>
public static partial class MathEx
{
    /// <summary>
    /// 2 つの整数の最大公約数を求めます.
    /// </summary>
    /// <param name="n">最初の値</param>
    /// <param name="m">2 番目の値</param>
    /// <returns>2 つの整数の最大公約数</returns>
    /// <remarks>ユークリッドの互除法に基づき最悪計算量 O(log N) で実行されます.</remarks>
    public static int GCD(int n, int m)
    {
        return (int) GCD((long) n, m);
    }


    /// <summary>
    /// 2 つの整数の最大公約数を求めます.
    /// </summary>
    /// <param name="n">最初の値</param>
    /// <param name="m">2 番目の値</param>
    /// <returns>2 つの整数の最大公約数</returns>
    /// <remarks>ユークリッドの互除法に基づき最悪計算量 O(log N) で実行されます.</remarks>
    public static long GCD(long n, long m)
    {
        n = Math.Abs(n);
        m = Math.Abs(m);
        while (n != 0)
        {
            m %= n;
            if (m == 0) return n;
            n %= m;
        }

        return m;
    }


    /// <summary>
    /// 2 つの整数の最小公倍数を求めます.
    /// </summary>
    /// <param name="n">最初の値</param>
    /// <param name="m">2 番目の値</param>
    /// <returns>2 つの整数の最小公倍数</returns>
    /// <remarks>最悪計算量 O(log N) で実行されます.</remarks>
    public static long LCM(long n, long m)
    {
        return (n / GCD(n, m)) * m;
    }
}

#endregion

#region PrimeSieve

public static partial class MathEx
{
    /// <summary>
    /// ある値までに素数表を構築します.
    /// </summary>
    /// <param name="max">最大の値</param>
    /// <param name="primes">素数のみを入れた数列が返される</param>
    /// <returns>0 から max までの素数表</returns>
    /// <remarks>エラトステネスの篩に基づき,最悪計算量 O(N loglog N) で実行されます.</remarks>
    public static bool[] Sieve(int max, List<int> primes = null)
    {
        var isPrime = new bool[max + 1];
        for (int i = 2; i < isPrime.Length; i++) isPrime[i] = true;
        for (int i = 2; i * i <= max; i++)
            if (!isPrime[i]) continue;
            else
                for (int j = i * i; j <= max; j += i)
                    isPrime[j] = false;
        if (primes != null)
            for (int i = 0; i <= max; i++)
                if (isPrime[i])
                    primes.Add(i);

        return isPrime;
    }
}

#endregion

class Scanner
{
    public Scanner()
    {
        _pos = 0;
        _line = new string[0];
    }

    const char Separator = ' ';
    private int _pos;
    private string[] _line;

    #region スペース区切りで取得

    public string Next()
    {
        if (_pos >= _line.Length)
        {
            _line = Console.ReadLine().Split(Separator);
            _pos = 0;
        }

        return _line[_pos++];
    }

    public int NextInt()
    {
        return int.Parse(Next());
    }

    public long NextLong()
    {
        return long.Parse(Next());
    }

    public double NextDouble()
    {
        return double.Parse(Next());
    }

    #endregion

    #region 型変換

    private int[] ToIntArray(string[] array)
    {
        var result = new int[array.Length];
        for (int i = 0; i < array.Length; i++)
        {
            result[i] = int.Parse(array[i]);
        }

        return result;
    }

    private long[] ToLongArray(string[] array)
    {
        var result = new long[array.Length];
        for (int i = 0; i < array.Length; i++)
        {
            result[i] = long.Parse(array[i]);
        }

        return result;
    }

    private double[] ToDoubleArray(string[] array)
    {
        var result = new double[array.Length];
        for (int i = 0; i < array.Length; i++)
        {
            result[i] = double.Parse(array[i]);
        }

        return result;
    }

    #endregion

    #region 配列取得

    public string[] Array()
    {
        if (_pos >= _line.Length)
            _line = Console.ReadLine().Split(Separator);

        _pos = _line.Length;
        return _line;
    }

    public int[] IntArray()
    {
        return ToIntArray(Array());
    }

    public long[] LongArray()
    {
        return ToLongArray(Array());
    }

    public double[] DoubleArray()
    {
        return ToDoubleArray(Array());
    }

    #endregion
}
0