QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#21399#2819. 摆家具gogo#WA 986ms485264kbC++203.7kb2022-03-04 19:00:042022-05-08 03:07:45

Judging History

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

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2022-05-08 03:07:45]
  • 评测
  • 测评结果:WA
  • 用时:986ms
  • 内存:485264kb
  • [2022-03-04 19:00:04]
  • 提交

answer

#include<bits/stdc++.h>
#define rep(i, l, r) for(int i = (l); i <= (r); i ++)
#define per(i, r, l) for(int i = (r); i >= (l); i --)
#define trv(i, u, v) for(int i = head[u], v = e[i].to; i; v = e[i = e[i].nxt].to)
#define fi first
#define se second
#define all(s) s.begin(), s.end()
#define sz(s) (int)(s.size())
#define lb(s) ((s) & -(s))
#define pb push_back
using namespace std;

typedef long long ll;
#define int ll
typedef pair<int, int> P;
mt19937_64 hua(time(0));
template<typename T> inline bool chkmx(T &x, T y) {return x < y ? x = y, 1 : 0;}
template<typename T> inline bool chkmn(T &x, T y) {return y < x ? x = y, 1 : 0;}
template<int T> using A = array<int, T>;

inline ll read() {
	ll x = 0, f = 1; char c = getchar();
	for(; !isdigit(c); c = getchar()) if(c == '-')  f = 0;
	for(; isdigit(c); c = getchar()) x = x * 10 + c - '0';
	return f ? x : -x;
}
const int maxn = 1e6;
const int maxk = 20;
//const int B = 1e5;
const int B = 3e3; 
const int mod = 998244353;
int n, k, q, N, pw[maxk + 5], w[maxn + 5];
int fac[maxk + 5], ifac[maxk + 5], inv[maxk + 5];
int f[maxn + 5][maxk + 5], g[maxn + 5][maxk + 5], h[maxn + 5][maxk + 5];
inline int add(int a, int b) {return (a += b) >= mod ? a - mod : a;}
inline int sub(int a, int b) {return (a -= b) < 0 ? a + mod : a;} 
inline int mul(int a, int b) {return 1ll * a * b % mod;}
inline void upd(int &a, int b) {a = add(a, b);}
inline int fpw(int a, int b) {
	int ans = 1;
	for(; b; b >>= 1, a = mul(a, a)) if(b & 1) ans = mul(ans, a);
	return ans;
}
struct Mat {
	int a[maxk + 2][maxk + 2];
	int* operator [] (int x) {return a[x];}
	Mat() {memset(a, 0, sizeof a);}
	friend Mat operator * (Mat x, Mat y) {
		Mat z;
		rep(i, 0, k) rep(j, 0, k) rep(l, 0, k) {
			upd(z[i][j], mul(x[i][l], y[l][j]));
		}
		return z;
	}
}mpw1[B + 5], mpw2[B + 5], mpw3[B + 5];
void init() {
	fac[0] = fac[1] = inv[0] = inv[1] = ifac[0] = ifac[1] = 1;
	rep(i, 2, maxk) fac[i] = mul(fac[i - 1], i);
	rep(i, 2, maxk) inv[i] = mul(inv[mod % i], mod - mod / i);
	rep(i, 2, maxk) ifac[i] = mul(ifac[i - 1], inv[i]); 
}
inline int c(int n, int m) {return mul(fac[n], mul(ifac[m], ifac[n - m]));} 
signed main() {
//	freopen("in.txt", "r", stdin);
//	cout << sizeof mpw1 / 1024 / 1024 << '\n';
//	cout << sizeof f / 1024 / 1024 << '\n';
	n = read(), k = read(), q = read();
	N = fpw(n, k);
	pw[0] = 1;
	init();
	rep(i, 1, k) pw[i] = pw[i - 1] * n;
	rep(i, 0, N - 1) f[i][0] = w[i] = read();
	rep(i, 0, k - 1) {
		memcpy(g, f, sizeof g);
		memcpy(h, f, sizeof h);
		rep(s, 0, N - 1) {
			rep(j, 0, k) {
				if(s / pw[i] % n != n - 1) {
					upd(g[s][j], g[s + pw[i]][j]);
				}
			}
		}
		rep(s, 0, N - 1) {
			rep(j, 0, k) {
				if(s / pw[i] % n != 0) {
					upd(h[s][j], h[s - pw[i]][j]);
				}
			}
		}
		rep(s, 0, N - 1) {
			per(j, k, 0) {
				f[s][j] = 0;
				if(s / pw[i] % n != 0) upd(f[s][j], h[s - pw[i]][j]);
				if(s / pw[i] % n != n - 1) upd(f[s][j], g[s + pw[i]][j]);
				if(j) upd(f[s][j], f[s][j - 1]);
			}
		}
	}
	Mat bs;
	rep(i, 0, k) {
		bs[i][i] = mul(k - i, n - 2);
		mpw1[0][i][i] = mpw2[0][i][i] = mpw3[0][i][i] = 1;
	}
	rep(i, 1, k) {
		bs[i][i - 1] = mul(i, n - 1);
	}
	rep(i, 0, k - 1) {
		bs[i][i + 1] = k - i;
	}
	rep(i, 1, B) {
		mpw1[i] = mpw1[i - 1] * bs;
	}
	rep(i, 1, B) {
		mpw2[i] = mpw2[i - 1] * mpw1[B];
	}
	rep(i, 1, B) {
		mpw3[i] = mpw3[i - 1] * mpw2[B];
	}
	ll lstans = 1;
	rep(i, 1, q) {
		ll a = read(), t = 1ll * read() * lstans % mod;
		int x = t / B % B, y = t % B, z = t / B / B, ans = 0;
//		assert(z <= B);
		Mat cur = mpw3[z] * mpw2[x] * mpw1[y];
		rep(i, 0, k) {
			upd(ans, mul(mul(cur[k][i], f[a][i]), fpw(c(k, i), mod - 2)));
		}
		cout << (lstans = ans) << '\n';
	}
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 0
Wrong Answer
time: 986ms
memory: 485264kb

input:

6 7 23333
691899807
511100503
969237388
938904792
350428599
320423686
227132681
288051232
833056445
128207711
81740114
850060462
194951182
130925016
505452669
304380595
703105541
640122112
75295756
128144693
482592240
835507949
68960843
807876145
6134269
259053259
386495729
193956365
370675670
12980...

output:

685062935
307961250
851598191
519118489
165240094
935521608
492161497
12369230
620253835
486191182
329676059
227835564
773776552
909894057
35951661
476688710
403783408
588037127
685211151
338349063
271993276
675096135
78069073
139730755
346814744
167653189
593826020
301819837
904430318
912311263
298...

result:

wrong answer 1st lines differ - expected: '190581075', found: '685062935'