AtCoderのABC    次のABCの問題へ    前のABCの問題へ

ABC163-D Sum of Large Numbers


問題へのリンク


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("3 2");
            //10
        }
        else if (InputPattern == "Input2") {
            WillReturn.Add("200000 200001");
            //1
        }
        else if (InputPattern == "Input3") {
            WillReturn.Add("141421 35623");
            //220280457
        }
        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 N = wkArr[0];
        long K = wkArr[1];

        const long Hou = 1000000007;

        long Answer = 0;
        for (long I = K; I <= N + 1; I++) {
            // 小さいほうの数列
            long First1 = 0;
            long Last1 = I - 1;
            long Sum1 = DeriveSum(First1, Last1);

            // 大きいほうの数列
            long First2 = N - I + 1;
            long Last2 = N;
            long Sum2 = DeriveSum(First2, Last2);
            Answer += Sum2 - Sum1 + 1;
            Answer %= Hou;
        }
        Console.WriteLine(Answer);
    }

    // 初項と末項を引数として、交差1の等差数列の和を返す
    static long DeriveSum(long pFirst, long pLast)
    {
        return (pFirst + pLast) * (pLast - pFirst + 1) / 2;
    }
}


解説

等差数列
0 1 2 3 4 5 6 7
から3個選択する時の、和の場合の数は、

0+1+2 =  3
5+6+7 = 18
で、16通りになります。