トップページに戻る    次の競技プログラミングの問題へ    前の競技プログラミングの問題へ

AGC-015-A A+...+B Problem

■■■問題■■■

すぬけ君は、整数をN個持っています。
このうち最小のものはA、最大のものはBです。

すぬけ君が持っている整数の総和としてありうる値は何通りあるでしょうか。

■■■入力■■■

N A B

●1 <= N,A,B <= 10億
●A,B は整数である

■■■出力■■■

総和としてありうる値の個数を出力せよ。


C#のソース

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static string InputPattern = "Input1";

    static List<string> GetInputList()
    {
        var WillReturn = new List<string>();

        if (InputPattern == "Input1") {
            WillReturn.Add("4 4 6");
            //5
            //18=4+4+4+6
            //19=4+4+5+6
            //20=4+5+5+6
            //21=4+5+6+6
            //22=4+6+6+6
            //の5つの値が総和として考えられます。
        }
        else if (InputPattern == "Input2") {
            WillReturn.Add("5 4 3");
            //0
        }
        else if (InputPattern == "Input3") {
            WillReturn.Add("1 7 10");
            //0
        }
        else if (InputPattern == "Input4") {
            WillReturn.Add("1 3 3");
            //1
        }
        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(X => long.Parse(X)).ToArray();
        long N = wkArr[0];
        long A = wkArr[1];
        long B = wkArr[2];

        if (A > B) {
            Console.WriteLine(0);
            return;
        }
        if (N == 1) {
            if (A == B) Console.WriteLine(1);
            else Console.WriteLine(0);
        }
        else {
            long RestCnt = N - 2;
            long MinSum = A + B + RestCnt * A;
            long MaxSum = A + B + RestCnt * B;

            Console.WriteLine(MaxSum - MinSum + 1);
        }
    }
}


解説

整数の総和の、最小値と最大値を求め、
その間の整数の個数が解となります。

下記の特殊ケースは別途処理してます。
●最小値 > 最大値
●N==1