はまやんはまやんはまやん

hamayanhamayan's blog

Many Powers [灘校75回生中学卒業記念コンテスト]

https://www.hackerrank.com/contests/75th/challenges/many-powers

解説

https://www.hackerrank.com/contests/75th/challenges/many-powers/submissions/code/1321980113

今回の問題の弱点はCが小さいことである。

例えば、(13 + 23 + 33 + 43 + 53 + 63 + 73) % 3を計算しようと考えたときに、
mod 3上では、43 = 13となるので、全部03~23に変換できる。
よって、(2 * 03 + 3 * 13 + 2 * 23) % 3を計算できればいいことになる。

解法としては、0~C-1を全探索する。
iBとなる個数を計算したいが、倍数の個数を計算しているようなものなので、単純な割り算で計算可能。
あとは、個数×iBの総和をmod Cでやれば答え。

ll A, B, C;
//---------------------------------------------------------------------------------------------------
void _main() {
    cin >> A >> B >> C;

    mod = C;

    int ans = 0;
    rep(i, 0, C) {
        ll cnt = A / C;
        if (0 < i && i <= A % C) cnt++;
        ans = add(ans, mul(cnt % C, modpow(i, B)));
    }
    cout << ans << endl;
}