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

ABC179-C A x B + C


問題へのリンク


C#のソース

using System;
using System.Collections.Generic;

class Program
{
    static string InputPattern = "InputX";

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

        if (InputPattern == "Input1") {
            WillReturn.Add("3");
            //3
        }
        else if (InputPattern == "Input2") {
            WillReturn.Add("100");
            //473
        }
        else if (InputPattern == "Input3") {
            WillReturn.Add("1000000");
            //13969985
        }
        else {
            string wkStr;
            while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
        }
        return WillReturn;
    }

    static void Main()
    {
        List<string> InputList = GetInputList();
        int N = int.Parse(InputList[0]);

        DerivePatternCnt(N);

        long Answer = 0;
        for (int LoopC = 1; LoopC <= N; LoopC++) {
            int RestVal = N - LoopC;
            if (mProdCntDict.ContainsKey(RestVal)) {
                Answer += mProdCntDict[RestVal];
            }
        }
        Console.WriteLine(Answer);
    }

    static Dictionary<int, int> mProdCntDict = new Dictionary<int, int>();

    // 掛けてN以下になるペアが、何通りあるかを求めておく
    static void DerivePatternCnt(int pN)
    {
        // 場合の数[積の値]
        for (int I = 1; I * I <= pN; I++) {
            for (int J = I; I * J <= pN; J++) {
                int Key = I * J;
                int AddCnt = (I == J ? 1 : 2);
                if (mProdCntDict.ContainsKey(Key)) {
                    mProdCntDict[Key] += AddCnt;
                }
                else {
                    mProdCntDict[Key] = AddCnt;
                }
            }
        }
    }
}


解説

A*Bの値と、場合の数を、事前に列挙しておいて、
Cの値で全探索してます。