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();
}
}