QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#21401#2819. 摆家具gogoWA 518ms244024kbC++203.7kb2022-03-04 19:13:182022-05-08 03:07:57

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:57]
  • 评测
  • 测评结果:WA
  • 用时:518ms
  • 内存:244024kb
  • [2022-03-04 19:13:18]
  • 提交

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;
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 + 1][maxk + 1];
	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]));} 
int 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 = read() * lstans % mod;
		int x = t / B % B, y = t % B, z = t / B / B, ans = 0;
		Mat cur = mpw3[z] * mpw2[x] * mpw1[y];
		rep(i, 0, k) {
			upd(ans, mul(mul(cur[k][i], f[a][i]), fpw(mul(c(k, i), fpw(n - 1, 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: 518ms
memory: 244024kb

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:

344801506
560852859
564750054
17991815
102308062
620926932
69301194
156650559
954460646
694453130
790865875
816849851
333042328
899850266
531548841
623823475
758253231
482977778
730757097
967932225
110426628
892098334
318929155
868040723
578377523
857439077
578863381
790647926
112546176
967933740
82...

result:

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