kb84tkhrのブログ

何を書こうか考え中です あ、あと組織とは関係ないってやつです 個人的なやつ

NTL_1_B: Power

べき乗
10^9乗なんてまともにやると大変なので
m^2n = m^n * m^nという関係を使ってlog nのオーダにしてやる

余りを求めろとなってるのは
a * b % q == (a % q) * (b % q)だから毎回余りをとってやればよかろう

1000000007で割るというのは32ビットで収まるように、
いや2乗しても64ビットに収まるように、ってことかな

def power(m, n):
    if n == 0:
        return 1
    elif n % 2 == 0:
        k = power(m, n // 2)
        return k * k % 1000000007
    else:
        k = power(m, (n - 1) // 2)
        return k * k * m % 1000000007

m, n = [int(x) for x in input().split()]
print(power(m, n))

いったんpower(m, n // 2)を変数に入れてやるのが大事
うっかりreturn power(m, n // 2) * power(m, n // 2)とか書いてしまうと
nのオーダになってしまう

ALDS_1_C: Prime Numbers (続き)

さてじゃあどうしよう
奇数偶数だけで分けるんじゃなくて、6で割った余りで分類することにすると
3000万回ループが節約できるな
でもあんまりスマートな気はしない

やっぱり1億までのふるいってのが無理あるのでは
1億までの数の素数の判定だから、1万までの素数をふるいで求めて
順番に割るっていう作戦もあるか
これならふるいにかかる時間は無視できる
1万までの素数がいくつあるかわからないけど1000として
ひとつの数の判定をするのに最大1000回の割り算
たいていはもっと速く終わるだろうから100回くらいになるとすると
1万個判定しても100万回の割り算
それくらいならいけるでしょう

sieveは昨日のをそのまま使ってこんな感じ

def primes(max):
    s = sieve(max)
    p = [2]
    for i in range(1, len(s)):
        if s[i] == 0:
            p.append(i * 2 + 1)
    return p


def is_prime(n, p):
    m = sqrt(n)
    for q in p:
        if q > m:
            return True
        if n % q == 0:
            return False
    return True

def main():
    p = primes(10000)
    n = int(input())
    sum = 0
    for _ in range(n):
        x = int(input())
        if is_prime(x, p):
            sum += 1
    print(sum)

00.12s 5704KBでAC
よかったよかった

解説
sqrt(n)までで割ればn - 1まで割るよりずっと早い
あらかじめ素数を用意した方がいいことがあってふるいが有効
知ってた

サンプルコード

・・・

ふるってねえ
そのままsqrt(n)まで割ってる

def is_prime(n):
    m = int(sqrt(n))
    for q in range(2, m + 1):
        if n % q == 0:
            return False
    return True

00.36s 5680KBでAC、って
ふるいの絵はなんだったのか
まあ3倍速いしな!

エラトステネスのふるいの計算量はO(N log log N)なんだって
へー へー へー

ALDS_1_C: Prime Numbers

整数論の章に入りました
最初は素数判定

ヒントは一目瞭然でエラトステネスのふるい

なんだけど

2 ≦ 与えられる整数 ≦ 10^8

1億までのふるい!?
メモリ制限65536KBってことは6500万バイトくらい
奇数だけ覚えることにすれば1バイトでひとつの数字を覚えておけば
ビットまで細かくしなくても足りることは足りるんだ

続きを読む

DPL_3_B: Largest Rectangle (続き)

やっぱりわかりませんでした
解説を見る

全探索のアルゴリズムでは時間内に答えを求めることはできません。

そうでしょうね

正方形を探すために用いたアルゴリズムも適用することができないため、別の方法を考える必要があります。

想定の範囲内

続きを読む