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

ARC-034-B 方程式

■■■問題■■■

正整数nに対し、nの十進表記における各桁の数の和をf(n)で表す。
例えば、f(123)=1+2+3=6, f(4)=4となる。

正整数Nが与えられる。
等式 x+f(x)=N を満たす正整数xを全て求めよ。

■■■入力■■■

N

1行目に、1個の整数 N (1 <= N <= 10の18乗) が与えられる。

■■■出力■■■

等式を満たす正整数xの値の個数をkとする。
1行目にkの値を出力し、続くk行に等式を満たす正整数xの値を昇順で各行に1個ずつ出力せよ。
末尾の改行を忘れないこと。


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("8");
            //1
            //4
            //問題文で述べたように f(4)=4 であり、
            //4以外に題意を満たす正整数は存在しない。
        }
        else if (InputPattern == "Input2") {
            WillReturn.Add("101");
            //2
            //91
            //100
            //複数の解が存在することがある
        }
        else if (InputPattern == "Input3") {
            WillReturn.Add("108");
            //0
            //解が存在しないこともある
        }
        else {
            string wkStr;
            while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
        }
        return WillReturn;
    }

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

        //Nは10の18乗までなので、9*17が最大の桁和となる
        const long MaxKetaSum = 9 * 17;

        var AnswerList = new List<long>();
        for (long I = N - MaxKetaSum; I <= N; I++) {
            if (I + DeriveKetaSum(I) == N) {
                AnswerList.Add(I);
            }
        }
        Console.WriteLine(AnswerList.Count);
        AnswerList.ForEach(X => Console.WriteLine(X));
    }

    //桁の数字の和を求める
    static long DeriveKetaSum(long pVal)
    {
        long WillReturn = 0;
        do {
            long ModVal = pVal % 10;
            WillReturn += ModVal;
            pVal /= 10;
        } while (pVal > 0);
        return WillReturn;
    }
}


解説

xの下限を数学的に考察して、計算量を減らしてます。