站外题求条
  • 板块题目总版
  • 楼主CC__DIAMOND
  • 当前回复5
  • 已保存回复5
  • 发布时间2024/6/9 12:23
  • 上次更新2024/6/9 15:22:45
查看原帖
站外题求条
636977
CC__DIAMOND楼主2024/6/9 12:23

题目链接 abc357_d 调了好久,对于 N>10N>10 完全不对,但是找不到错误,似乎答案没有超过模数 998244353998244353 的情况都是对的(99 也是对的),但是超过模数的情况就出错了。

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
constexpr ll mod = 998244353;

ll exp10[60], x, len;

ll q_pow(ll a, __int128 exp) {
    ll ans = 1;
    while (exp) {
        if (exp & 1) ans = ans * a % mod, --exp;
        else a = a * a % mod, exp >>= 1;
    }
    return ans;
}

ll f(ll times) {
    if (!times) return 0;
    __int128 e1 = len;
    e1 *= times - 1;
    ll ans = 0, h = x % mod * q_pow(10, e1) % mod;
    ans += h;
    int p;
    for (p = 1; 1ll << p <= times; ++p) {
        const __int128 e = (1ll << (p - 1)) * len;
        h = ans * q_pow(10, e * (mod - 2)) % mod;
        ans += h;
        ans %= mod;
    }
    return (ans + f(times - (1ll << (p - 1)))) % mod;
}

int main() {
    cin >> x;
    len = static_cast<ll>(log10(x) + 1);
    cout << f(x) << '\n';
    // int t = 10, ans = 0;
    // for (int i = 0; i < t; ++i) {
    //     ans += t;
    //     t *= 10;
    //     ans %= mod, t %= mod;
    // }
    // cout << ans << '\n';
    return 0;
}

2024/6/9 12:23
加载中...