救救孩子,一道概率期望题调了半天依旧是 70 分
查看原帖
救救孩子,一道概率期望题调了半天依旧是 70 分
112917
Eason_AC楼主2021/7/26 18:00

RT,后面六个点无论怎么调死活都是 WA,还请各位大佬帮忙看看 /kk

代码(主要部分)

namespace Solution {
	const ll N = 5e5 + 7, mod = 1e9 + 7, inv2 = 5e8 + 4;
	ll n, m, ans, cntf, cntg, p[N], c[2][N];
	struct matrix {
		ll mat[17][17];
		matrix operator * (const matrix& t) const {
			matrix res; memset(res.mat, 0, sizeof(res.mat));
			F(int, i, 0, 6) F(int, j, 0, 6) F(int, k, 0, 6) res.mat[i][j] = (res.mat[i][j] + mat[i][k] * t.mat[k][j]) % mod;
			return res;
		}
	}a, cur;
	
	ll lowbit(ll x) {return x & -x;}
	iv update(ll id, ll x, ll val) {for(; x <= n; x += lowbit(x)) c[id][x] = (c[id][x] + val) % mod;}
	ill sum(ll id, ll x) {
		ll res = 0;
		for(; x; x -= lowbit(x)) res = (res + c[id][x]) % mod;
		return res;
	}
	ill ksm(ll a, ll b) {
		ll res = 1;
		for(; b; b >>= 1, a = 1ll * a * a % mod)
			if(b & 1) res = 1ll * res * a % mod;
		return res;
	}
	ill c2(ll n) {return n * (n - 1) * inv2 % mod;}
	
    iv Main() {
		n = Rint, m = Rint;
		F(int, i, 1, n) p[i] = Rll;
		a = (matrix){{
			{c2(n - 2), 1, n - 2, 0, n - 2, 0, 0},
			{1, c2(n - 2), 0, n - 2, 0, n - 2, 0},
			{1, 0, (c2(n - 2) + (n - 3)) % mod, 1, 0, 1, n - 3},
			{0, 1, 1, (c2(n - 2) + (n - 3)) % mod, 1, 0, n - 3},
			{1, 0, 0, 1, (c2(n - 2) + (n - 3)) % mod, 1, n - 3},
			{0, 1, 1, 0, 1, (c2(n - 2) + (n - 3)) % mod, n - 3},
			{0, 0, 1, 1, 1, 1, (c2(n - 2) + 2 * (n - 4) + 1) % mod}
		}};
//		F(int, i, 0, 6) F(int, j, 0, 6) printf("%d%c", a.mat[i][j], " \n"[j == 6]);
		cur.mat[0][0] = 1;
		for(; m; m >>= 1, a = a * a)
			if(m & 1) cur = cur * a;
//		F(int, i, 0, 6) F(int, j, 0, 6) printf("%d%c", cur.mat[i][j], " \n"[j == 6]);
		F(int, i, 1, n) {
			ll t1 = sum(0, p[i]), t2 = i - t1 - 1, ft1 = sum(1, p[i]), ft2 = (cntf - ft1 + mod) % mod, gt1 = ((n - 2) * t1 - ft1) % mod, gt2 = (cntg - gt1 + mod) % mod;
//			printf("%lld %lld %lld %lld %lld %lld %lld %lld %lld %lld\n", t1, t2, ft1, ft2, gt1, gt2, cntf, cntg, cntg - gt1, (cntg - gt1 + mod) % mod);
			ans = (ans + t2 * cur.mat[0][0]) % mod;
			ans = (ans + t1 * cur.mat[0][1]) % mod;
			ans = (ans + ((t2 * (i - 2) % mod + t1 * (n - i) % mod) % mod * cur.mat[0][2] % mod) * ksm(n - 2, mod - 2)) % mod;
			ans = (ans + ((t1 * (i - 2) % mod + t2 * (n - i) % mod) % mod * cur.mat[0][3] % mod) * ksm(n - 2, mod - 2)) % mod;
			ans = (ans + (gt2 + ft1) * cur.mat[0][4] % mod * ksm(n - 2, mod - 2) % mod) % mod;
			ans = (ans + (gt1 + ft2) * cur.mat[0][5] % mod * ksm(n - 2, mod - 2) % mod) % mod;
			update(0, p[i], 1), update(1, p[i], i - 1), cntf = (cntf + i - 1) % mod, cntg = (cntg + n - i - 1) % mod;
		}
		return write((ans + c2(n) * inv2 % mod * cur.mat[0][6] % mod) % mod), void();
	}
}
2021/7/26 18:00
加载中...