トップページに戻る    次のC#のサンプルへ    前のC#のサンプルへ

Problem211 約数の2乗の和

問題

正の整数 n に対して, ★2(n)を約数の2乗の和とする. 例えば,

★2(10) = 1 + 4 + 25 + 100 = 130

である.
0 < n < 64000000 で, ★2(n) が平方数である全ての n の和を求めよ.


ソース

using System;

class Program
{
    static void Main()
    {
        var sw = System.Diagnostics.Stopwatch.StartNew();

        long AnswerVal = 0;
        for (int I = 1; I < 64000000; I++) {
            if (I % 100000 == 1)
                Console.WriteLine("{0}。残りは{1}。現在の合計={2}", sw.Elapsed, 64000000 - I, AnswerVal);

            long YakusuuSum = DeriveYakusuuSum(I);
            if (IsHeihouSuu(YakusuuSum)) AnswerVal += I;
        }
        Console.WriteLine(AnswerVal);
    }

    static long DeriveYakusuuSum(int pVal)
    {
        int WillReturn = 0;
        for (int I = 1; I * I <= pVal; I++) {
            if (pVal % I == 0) {
                WillReturn += I * I;
                int PairVal = pVal / I;
                if (PairVal != I) WillReturn += PairVal * PairVal;
            }
        }
        return WillReturn;
    }

    //2分法で平方数かの判定
    static bool IsHeihouSuu(long pVal)
    {
        long LeftP=0;
        long RightP = pVal;
        long MidP;

        while (LeftP <= RightP) {
            MidP = (LeftP + RightP) / 2;
            //Console.WriteLine("探索対象={0},LeftP={1},MidP={2},RightP={3}", pVal, LeftP, MidP, RightP);
            long NijyouVal = MidP*MidP;
            if (NijyouVal == pVal) return true;
            if (NijyouVal > pVal) {
                RightP = MidP - 1;
            }
            else {
                LeftP = MidP + 1;
            }
        }
        return false;
    }
}


実行結果

計算量が多すぎるので、作り直しが必要です。


解説

答え 1922364685