万能欧几里得算法 TLE 求助
查看原帖
万能欧几里得算法 TLE 求助
282929
柳易辰楼主2024/8/20 18:45
#include <stdio.h>
typedef const int ci; ci p(998244353);
int f, g, h[3][3] = {{1, 0, 0}, {1, 1, 0}, {1, 2, 1}};
struct st
{
    int x, y, e[3][3];
    st() { x = y = 0; for (int i(0); i < 3; ++i) for (int j(0); j < 3; ++j) e[i][j] = 0; }
    st operator * (const st t)
    {
        st c(*this); c.x = (x + t.x) % p; c.y = (y + t.y) % p;
        for (int i(0); i <= f; ++i) for (int j(0); j <= g; ++j)
        for (int pi(0), vi(1); pi <= i; ++pi, vi = (long long)vi * y % p)
        for (int pj(0), vj(1); pj <= j; ++pj, vj = (long long)vj * x % p)
            c.e[i][j] = (c.e[i][j] + (long long)h[i][pi] * h[j][pj] % p * vi % p * vj % p * t.e[i - pi][j - pj]) % p;
        return c;
    }
    st operator ^ (int i) const
    {
        st c(*this), t;
        while (i) { if (i & 1) t = t * c; i >>= 1; c = c * c; }
        return t;
    }
};
st calc(ci n, ci a, ci b, ci c, const st u, const st r)
{
    const long long m(((long long)a * n + b) / c); if (!m) return r ^ n;
    if (a >= c) return calc(n, a % c, b, c, u, (u ^ a / c) * r);
    return (r ^ (c - b - 1) / a) * u * calc(m - 1, c, (c - b - 1) % a, a, r, u)
           * (r ^ (n - (m * c - b - 1) / a));
}
void solve(ci n, ci a, ci b, ci c)
{
    st u, r, v; u.x = r.y = 1; v.x = b / c;
    for (int i(0); i <= f; ++i) r.e[i][0] = 1;
    for (int i(0), j(1); i <= g; ++i, j = (long long)j * v.x % p) v.e[0][i] = j;
    v = v * calc(n, a, b % c, c, u, r); printf("%d ", v.e[f][g]);
}

int main()
{
    int t; scanf("%d", &t); while (t--) {
        int n, a, b, c; scanf("%d%d%d%d", &n, &a, &b, &c);
        f = 0, g = 1; solve(n, a, b, c);
        f = 0, g = 2; solve(n, a, b, c);
        f = g = 1; solve(n, a, b, c); puts("");
    } return 0;
}

这是我通过 LOJ138 类欧几里得算法 后修改后的代码,即求 ∑i=0nif⌊ai+bc⌋g\sum\limits_{i=0}^ni^f\lfloor\dfrac{ai+b}c\rfloor^g。

2024/8/20 18:45
加载中...