blog.bouzuya.net

2023-02-27 nostr-keygen 0.1.0 をつくった / ARC149 の A を解いた

nostr-keygen 0.1.0 をつくった。 bouzuya/rust-sandbox に置いている。

nostr-keygen は prefix を指定して nostr で使用するための keypair を生成するコマンド。 nostr では public key が露出していることも多いので「良い感じ」の keypair が欲しくなったのでつくった。

NIP-19 https://github.com/nostr-protocol/nips/blob/master/19.md に書かれているとおり nostr では bech32 形式で public key を表示することが推奨されている。この形式にしたとき「良い感じ」のものが欲しい。

nostr-keygen で 60 を prefix に指定すると、例えば npub160ulkrt40kpqtr6l3jd20tcswuykx2wkfwn6pskn8d8rp0c3dznsvd7tm4 が得られる。

bech32 形式では '1', 'b', 'i', 'o' をデータに使えない。 bouzuyabo からはじまるので残念だけど 60 で探している。

60uzu からはじまる keypair は得たのだけど、どうせなら 60uzuya を目指してみている。文字種が 32 で 7 桁なので 32 ^ 7 = 34_359_738_368 。毎秒 5_000 個くらいは試せるけど、このペースだと 80 日くらいかかるのか……。やめたほうがよさそう。


ARC149 : AtCoder Regular Contest 149 の A を解いた。

  • A - Repdigit Number https://atcoder.jp/contests/arc149/tasks/arc149_a
    • 提出: https://atcoder.jp/contests/arc149/submissions/39295894
    • 1..=X を確認するのは間に合わない
    • M の倍数を順に探すのも間に合わない
    • 各桁の数字は 1..=9 で、それぞれ最大 10^5 桁なので、すべて試しても間に合う
    • 愚直に剰余をとって M の倍数かを確かめるには数字が大きすぎる
    • 下の桁から順に ((10 * x) % m + d) % m する
    • 結果が 0 (M の倍数) になる、桁と数字を記録する
    • 最大の桁数のもの、桁数が同じなら数字の大きいものを選んで出力すれば答えになる
    • 選べなかったときは -1
use proconio::input;

fn main() {
    input! {
        n: usize,
        m: usize,
    };

    let mut ans = (0, 0);
    for d in 1..=9 {
        let mut maxlen = 0;
        let mut x = 0;
        for len in 1..=n {
            x = ((10 * x) % m + d) % m;
            if x == 0 {
                maxlen = maxlen.max(len);
            }
        }
        if maxlen > 0 && maxlen >= ans.0 {
            ans = (maxlen, d);
        }
    }
    if ans == (0, 0) {
        println!("-1");
    } else {
        for _ in 0..ans.0 {
            print!("{}", ans.1);
        }
        println!();
    }
}

今日のコミット。