QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#470111#547. BM 算法ZnPdCoWA 102ms4472kbC++142.1kb2024-07-10 10:22:302024-07-10 10:22:31

Judging History

This is the latest submission verdict.

  • [2024-12-28 21:37:58]
  • hack成功,自动添加数据
  • (/hack/1317)
  • [2024-07-10 10:22:31]
  • Judged
  • Verdict: WA
  • Time: 102ms
  • Memory: 4472kb
  • [2024-07-10 10:22:30]
  • Submitted

answer

#include <bits/stdc++.h>
#define ll long long
#define P 998244353
#define p 998244353
#define N 10010
using namespace std;
ll n, m, q;
ll qpow(ll x, ll y) {
	if(y == 0) return 1;
	if(y % 2 == 1) return x * qpow(x, y - 1) % P;
	ll tmp = qpow(x, y / 2);
	return tmp * tmp % P;
}
vector<ll> bm(vector<ll> f) {
	vector<ll> v, last;
	ll k = -1, delta = 0;
	for(int i = 0; i < (ll)f.size(); i ++) {
		ll tmp = 0;
		for(ll j = 0; j < (ll)v.size(); j ++) {
			(tmp += f[i - j - 1] * v[j] % P) %= P;
			if(tmp < 0) tmp += P;
		}
		
		if(f[i] == tmp) continue;
		
		if(k == -1) {
			k = i;
			delta = (f[i] - tmp) % P;
			if(delta < 0) delta += P;
			v = vector<ll>(i + 1);
			
			continue;
		}
		
		vector<ll> u = v;
		ll val = ((f[i] - tmp) % P + P) % P * qpow(delta, P - 2) % P;
		
		if(v.size() < last.size() + i - k) v.resize(last.size() + i - k);
		
		(v[i - k - 1] += val) %= P;
		
		for(ll j = 0; j < (ll)last.size(); j ++) {
			(v[i - k + j] -= val * last[j] % P) %= P;
			if(v[i - k + j] < 0) v[i - k + j] += P;
		}
		
		if((ll)u.size() - i < (ll)last.size() - k) {
			last = u;
			k = i;
			delta = (f[i] - tmp) % P;
			if(delta < 0) delta += P;
		}
	}
	return v;
}

vector<ll> mul(vector<ll> x, vector<ll> y) {
	vector<ll> res(2 * q);
	
//	for(ll i = 0; i )
}

ll calc(vector<ll> f, vector<ll> a) {
	if(m < q * 2) {
		return f[m];
	}
	
	vector<ll> x = a, w = a;
	
	ll t = (m - q) / q, rem = (m - q) % q;
	while(t) {
		if(t & 1)
			w = mul(w, x);
		x = mul(x, x);
		t /= 2;
	}
	
	ll res = 0;
	for(ll i = 0; i < q; i ++) {
		(res += w[i] * f[rem + q - i - 1] % P) %= P;
		if(res < 0) res += P;
	}
	
	return res;
}
int main() {
	scanf("%lld %lld", &n, &m);
	vector<ll> f(n);
	for(ll i = 0; i < n; i ++) {
		scanf("%lld", &f[i]);
	}
	auto a = bm(f);
	q = a.size();
	printf("%lld\n", q);
	for(ll i = 0; i < q; i ++) {
		printf("%lld ", a[i]);
	}
	printf("\n");
//	for(ll i = n; i < q * 2; i ++) {
//		f.push_back(0);
//		for(ll j = 0; j < q; j ++) {
//			(f[i] += a[j] * f[i - j - 1] % P) %= P;
//			if(f[i] < 0) f[i] += P;
//		}
//	}
//	printf("%lld", calc(f, a));
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 0
Wrong Answer
time: 102ms
memory: 4472kb

input:

10000
481761257 325845401 89198273 331256176 423285801 510703206 160079009 805700484 2785453 119847482 4456012 47414124 382685410 463638256 314056646 483110670 723760177 473280072 294639899 965560586 243267953 822936984 475063108 193430844 842374415 125382693 569285769 643640101 548245375 253979925 ...

output:

7226
519996520 676098795 636816471 494383311 88254187 542188011 442632990 847848618 639292958 22724161 734302549 364991396 926096346 988368003 304154451 342281483 623977164 383132553 297361731 782343399 865656753 547123615 620909076 813317753 466953279 371327965 118623130 665641245 786523122 6711004...

result:

wrong answer you didn't minimize k