AT_agc023_e [AGC023E] Inversions 题解
设
则符合要求的排列共有
考虑每对位置
此时
所以此时
考虑预处理
实际上并不是,考虑
改变
考虑枚举
#include <cstdio>
#include <cstring>
#define M 1000000007
#define int long long
int n, s, q, a[200050], c[200050], d[200050], l[200050];
int P(int x, int y)
{
int q = 1;
for (; y; y >>= 1, x = x * x % M)
if (y & 1)
q = q * x % M;
return q;
}
struct T
{
int c[200050];
void C(int x, int k)
{
for (; x <= n; x += x & -x)
c[x] = (c[x] + k) % M;
}
int Q(int x, int y)
{
int q = 0;
for (x -= !!x; y > x; y &= y - 1)
q = (q + c[y]) % M;
for (; x > y; x &= x - 1)
q = (q + M - c[x]) % M;
return q;
}
} C, D;
signed main()
{
scanf("%lld", &n);
for (int i = 1; i <= n; ++i)
scanf("%lld", a + i), ++c[a[i]];
for (int i = n; i; --i)
c[i] += c[i + 1];
for (int i = 1; i <= n; ++i)
if (!(c[i] -= n - i))
return !puts("0");
d[0] = s = 1;
for (int i = 1; i <= n; ++i)
{
s = s * c[i] % M;
d[i] = d[i - 1] * P(c[i], M - 2) % M;
if (c[i] == 1)
l[i] = i;
else
d[i] = d[i] * (c[i] - 1) % M, l[i] = l[i - 1];
}
for (int i = 1; i <= n; ++i)
q = (q + s * P(2, M - 2) % M * d[a[i]] % M * C.Q(l[a[i]], a[i])) % M, C.C(a[i], P(d[a[i]], M - 2));
memset(C.c, 0, sizeof C.c);
for (int i = n; i >= 1; --i)
q = (q + s * D.Q(1, a[i] - 1) % M + M - s * P(2, M - 2) % M * d[a[i]] % M * C.Q(l[a[i]], a[i] - 1) % M) % M, C.C(a[i], P(d[a[i]], M - 2)), D.C(a[i], 1);
printf("%lld", q);
return 0;
}
分类:
题解
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具