TCHS08 Online Round 3 Medium 練習

問題

1〜nまでの全ての数で割り切れる最小の数を987654321で割った余りを求めなさい。

これもやっていくだけ。最小公倍数なので素数をチェックしてかけていく。

注意しなきゃいけないのは、ある素数 p (1 ≦ p ≦ n) に対して、px (px ≦ n) が最大になるような px を使うというところ。

たとえば n = 10 のとき、素数としては 2, 3, 5, 7だけど実際乗算するのは 8(23), 9(32), 5, 7 にする。

using System;
using System.Text;
using System.Text.RegularExpressions;
using System.Collections;
using System.Collections.Generic;

public class OneTwoThree {
    private bool isp(int a)
    {
        if (a <= 2) return true;
        if (a % 2 == 0) return false;
        for (int i = 3; i * i <= a; ++i)
            if (a % i == 0)
                return false;
        return true;
    }

    public int minimalNumber(int n) {
        long t = 1;

        for (int i = 2; i <= n; ++i)
        {
            if (isp(i))
            {
                long p = i;
                while (p * i <= n) p *= i;
                t *= p;
                t %= 987654321;
            }
        }

        return (int)t;
    }
}

EasyよりMediumのソースの方が短くて纏まってる。やるだけ問題苦手。