QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#458136#8834. Formal Fringucup-team052#AC ✓39ms13836kbC++142.2kb2024-06-29 15:58:472024-06-29 15:58:48

Judging History

你现在查看的是最新测评结果

  • [2024-06-29 15:58:48]
  • 评测
  • 测评结果:AC
  • 用时:39ms
  • 内存:13836kb
  • [2024-06-29 15:58:47]
  • 提交

answer

#include <bits/stdc++.h>
#define rep(i, a, b) for (int i = a; i <= b; i++)
#define per(i, a, b) for (int i = a; i >= b; i--)
using namespace std;

typedef unsigned long long ull;
typedef pair <int, int> pii;
typedef long long ll;

template <typename _T>
inline void read(_T &f) {
    f = 0; _T fu = 1; char c = getchar();
    while (c < '0' || c > '9') { if (c == '-') { fu = -1; } c = getchar(); }
    while (c >= '0' && c <= '9') { f = (f << 3) + (f << 1) + (c & 15); c = getchar(); }
    f *= fu;
}

template <typename T>
void print(T x) {
    if (x < 0) putchar('-'), x = -x;
    if (x < 10) putchar(x + 48);
    else print(x / 10), putchar(x % 10 + 48);
}

template <typename T>
void print(T x, char t) {
    print(x); putchar(t);
}

const int md = 998244353;

inline int add(int x, int y) {
    if (x + y >= md) return x + y - md;
    return x + y;
}

inline void addx(int &x, int y) {
    x += y;
    if (x >= md) x -= md;
}

inline int sub(int x, int y) {
    if (x < y) return x - y + md;
    return x - y;
}

inline void subx(int &x, int y) {
    x -= y;
    if (x < 0) x += md;
}

inline int mul(int x, int y) { return 1ull * x * y % md; }

inline int fpow(int x, int y) {
    int ans = 1;
    while (y) {
        if (y & 1) ans = mul(ans, x);
        y >>= 1; x = mul(x, x);
    }
    return ans;
}

const int N = 2e6 + 5;

int dp[N], s[N], f[21];
int n;

int main() {
    read(n);
    dp[0] = s[0] = 1;
    for (int i = 1; i <= n; i++) {
        dp[i] = s[i / 2];
        s[i] = add(s[i - 1], dp[i]);
    }
    f[1] = 1;
    for (int i = 2; i <= 20; i++) {
        f[i] = dp[(1 << i) - 1];
        for (int j = 1; j < i; j++) f[i] = sub(f[i], mul(f[j], dp[(1 << (i - j)) - 1]));
    }
    for (int i = 1; i <= n; i++) {
        int ans = 0;
        int b = 0;
        while ((1 << (b + 1)) <= i) ++b;
        int p = b;
        while (p && ((i >> (p - 1)) & 1)) --p;
        int now = i;
        for (int i = 1; i <= b - p + 1; i++) {
            now -= (1 << (b - i + 1));
            ans = add(ans, mul(f[i], dp[now]));
        }
        print(ans, i == n ? '\n' : ' ');
    }
    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 1ms
memory: 5756kb

input:

10

output:

1 1 2 1 1 3 6 1 1 2

result:

ok 10 numbers

Test #2:

score: 0
Accepted
time: 1ms
memory: 5708kb

input:

70

output:

1 1 2 1 1 3 6 1 1 2 2 5 5 11 26 1 1 2 2 4 4 6 6 11 11 16 16 27 27 53 166 1 1 2 2 4 4 6 6 10 10 14 14 20 20 26 26 37 37 48 48 64 64 80 80 107 107 134 134 187 187 353 1626 1 1 2 2 4 4 6

result:

ok 70 numbers

Test #3:

score: 0
Accepted
time: 39ms
memory: 13836kb

input:

1000000

output:

1 1 2 1 1 3 6 1 1 2 2 5 5 11 26 1 1 2 2 4 4 6 6 11 11 16 16 27 27 53 166 1 1 2 2 4 4 6 6 10 10 14 14 20 20 26 26 37 37 48 48 64 64 80 80 107 107 134 134 187 187 353 1626 1 1 2 2 4 4 6 6 10 10 14 14 20 20 26 26 36 36 46 46 60 60 74 74 94 94 114 114 140 140 166 166 203 203 240 240 288 288 336 336 400 ...

result:

ok 1000000 numbers

Extra Test:

score: 0
Extra Test Passed