QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#940457#9614. 分治Str_ywr20 31ms13160kbC++144.1kb2025-03-17 19:43:172025-03-17 19:43:19

Judging History

This is the latest submission verdict.

  • [2025-03-17 19:43:19]
  • Judged
  • Verdict: 20
  • Time: 31ms
  • Memory: 13160kb
  • [2025-03-17 19:43:17]
  • Submitted

answer

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
inline ll read() {
    ll x = 0, f = 1;
    char ch = getchar();
    while (ch < '0' || ch > '9') {
        if (ch == '-') f = -1;
        ch = getchar();
    }
    while (ch >= '0' && ch <= '9') {
        x = (x << 1) + (x << 3) + (ch ^ 48);
        ch = getchar();
    } return x * f;
}
const int N = 3e5 + 10, mod = 998244353, lm = 200; const ll inf = 1e18; 
ll jc[N], jcn[N], pw[N];
ll qpow(ll x, ll y) {
	ll ans = 1;
	while (y) {
		if (y & 1) ans = (ans * x) % mod;
		x = (x * x) % mod; y >>= 1;
	} return ans;
} string s;
ll C(int n, int m) {
    if (n < 0 || m < 0 || m > n) return 0;
    return jc[n] * jcn[m] % mod * jcn[n-m] % mod;
}
namespace sub1{
	int n;
	ll solve(int nn) {
        n = nn;
		ll sum = 0; n--;
		for (int m = 1; m <= n; m++) {
			for (int j = 1; j * m <= n; j++) {
				sum = (sum + ((j & 1) ? 1 : -1) * (C(n-j*m,j) * (n-j*m-j < 0 ? 0 : pw[n-j*m-j]) + C(n-j*m,j-1) * (n-j*m-j+1 < 0 ? 0 : pw[n-j*m-j+1]))) % mod; 
			}
		}
		sum = (sum % mod + mod) % mod;
        return sum;
	}
}
namespace sub2 {
    int n; ll f[N], g[N]; int mx, las, t;
    ll calc(int n, int k) {
        // !!!! n = 0?????
        int st = max(mx, k);
        ll sum = st * qpow(2, n) % mod; //求>=k的方案
        if (sub2::n > 2e3) {
            for (int m = 1; m <= st; m++) {
                for (int j = 1; j <= n && j * m <= n; j++) {
                    sum = (sum - ((j & 1) ? 1 : -1) * C(n-j*m, j) * (n-j*m-j < 0 ? 0 : pw[n-j*m-j])) % mod;
                }
                for (int j = 0; j <= n && j * m <= n; j++) {
                    sum = (sum - ((j & 1) ? -1 : 1) * C(n-j*m-max(0,(m-k)), j) * (n-j*m-j-max(0,(m-k)) < 0 ? 0 : pw[n-j*m-j-max(0,(m-k))])) % mod;
                }
            } 
        }
        // ll sum = 0;
        for (int m = 1; m <= n + k; m++) {
            for (int j = 1; j <= n && j * m <= n; j++) {
                sum = (sum + ((j & 1) ? 1 : -1) * C(n-j*m, j) * (n-j*m-j < 0 ? 0 : pw[n-j*m-j])) % mod;
            }
            for (int j = 0; j <= n && j * m <= n; j++) {
                sum = (sum + ((j & 1) ? -1 : 1) * C(n-j*m-max(0,(m-k)), j) * (n-j*m-j-max(0,(m-k)) < 0 ? 0 : pw[n-j*m-j-max(0,(m-k))])) % mod;
            }
        } return sum;
    }
    void solve() {
        n = s.size(); ll sum = 0;
        for (int i = 0; i < n; i++) sum = (sum * 2 + s[i] - '0') % mod;
        sum += sub1::solve(n); sum %= mod;
        mx = 1, las = 1, t = 1; set<int> ss;
        for (int i = 1; i < n; i++) {
            if (s[i] == '1') {
                int k = (t == 1 ? las + 1 : 1);
                if (ss.insert(max(k, mx)).second) {
                    for (int j = 1; j <= 450; j++) {
                        f[1] = 1; g[1] = 1;
                        for (int i = 2; i <= n; i++) {
                            f[i] = (2 * f[i-1] + f[i-2] + C(n, i) + C(n-j,i)) % mod;
                        }
                        for (int i = 2; i <= n; i++) {
                            g[i] = (3 * g[i-1] + g[i-2] + C(n, i) + C(n-j,i)) % mod;
                        }
                    }
                }
                assert(ss.size() <= 30);
                sum = (sum + calc(n - i - 1, k)) % mod; 
            }
            // int k = t == 1 ? las + 1 : ;
            int nw = s[i] - '0'; nw ^= 1;
            if (nw == t) las++;
            else las = 1, t = nw;
            if (t == 1) mx = max(mx, las);
        }
        sum = (sum % mod + mod) % mod;
        cout << sum;
    }
}
int main() {
	// assert(__lg(0) == -1);
    cin >> s; bool fl = 1;
    for (int i = 0; i < s.size(); i++) {
        fl &= (!i || s[i] == '0');
    }
    jc[0] = jcn[0] = pw[0] = 1;
    for (int i = 1; i < N; i++) jc[i] = (jc[i-1] * i) % mod;
    for (int i = 1; i < N; i++) pw[i] = (pw[i-1] << 1) % mod;
    jcn[N-1] = qpow(jc[N-1], mod - 2);
    for (int i = N - 2; i >= 1; i--) {
        jcn[i] = (jcn[i+1] * (i + 1)) % mod;
    }
    sub2::solve();
    // if ((fl && s.size() > 7)) {
    // 	cout << sub1::solve(s.size()); return 0;
	// } else {
	// 	sub2::solve(); return 0;
	// }
    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Subtask #1:

score: 0
Wrong Answer

Test #1:

score: 0
Wrong Answer
time: 3ms
memory: 13160kb

input:

110

output:

19

result:

wrong answer 1st numbers differ - expected: '15', found: '19'

Subtask #2:

score: 0
Skipped

Dependency #1:

0%

Subtask #3:

score: 0
Skipped

Dependency #2:

0%

Subtask #4:

score: 5
Accepted

Test #7:

score: 5
Accepted
time: 4ms
memory: 11976kb

input:

100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

output:

412796008

result:

ok 1 number(s): "412796008"

Test #8:

score: 5
Accepted
time: 4ms
memory: 11724kb

input:

100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

output:

818656648

result:

ok 1 number(s): "818656648"

Subtask #5:

score: 0
Skipped

Dependency #3:

0%

Subtask #6:

score: 5
Accepted

Dependency #4:

100%
Accepted

Test #11:

score: 5
Accepted
time: 3ms
memory: 11852kb

input:

100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...

output:

340672883

result:

ok 1 number(s): "340672883"

Test #12:

score: 5
Accepted
time: 3ms
memory: 10708kb

input:

100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...

output:

555946758

result:

ok 1 number(s): "555946758"

Subtask #7:

score: 0
Skipped

Dependency #5:

0%

Subtask #8:

score: 10
Accepted

Dependency #6:

100%
Accepted

Test #15:

score: 10
Accepted
time: 18ms
memory: 12344kb

input:

100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...

output:

468567454

result:

ok 1 number(s): "468567454"

Test #16:

score: 10
Accepted
time: 31ms
memory: 12152kb

input:

100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...

output:

12752860

result:

ok 1 number(s): "12752860"

Subtask #9:

score: 0
Skipped

Dependency #1:

0%