Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
30408 gaochunzhen 【S】T2 C++ 运行超时 60 1000 MS 4956 KB 3697 2024-07-19 13:48:19

Tests(12/20):


#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 3e5 + 9, Mod = 1e9 + 7; int fpow(int a, int b = Mod - 2) { int res = 1; while (b) { if (b & 1) res = 1ll * res * a % Mod; a = 1ll * a * a % Mod, b >>= 1; } return res; } int n, q, pw[N], ip[N]; namespace sub1 { int a[11], vis[11], ans[11], qr[11]; int binsearch(int L, int R, int x) { if (L > R) return 0; int MID = (L + R) / 2; if (a[MID] == x || L == R) return a[MID]; if (a[MID] > x) return a[MID] + binsearch(L, MID - 1, x); if (a[MID] < x) return a[MID] + binsearch(MID + 1, R, x); } void dfs(int u) { if (u > n) { for (int i = 1; i <= q; i++) { (ans[i] += binsearch(1, n, qr[i])) %= Mod; } return; } for (int i = 1; i <= n; i++) { if (vis[i]) continue; vis[i] = 1, a[u] = i; dfs(u + 1); vis[i] = 0; } } void Main() { for (int i = 1; i <= q; i++) scanf("%d", &qr[i]); dfs(1); for (int i = 1; i <= q; i++) printf("%d\n", ans[i]); } } namespace sub2 { void Main() { int x = (n + 1) >> 1, c = 1, ans = 0; int s = 1ll * (n - 1) * (n + 2) / 2 % Mod; while (x) { ans = (ans + 1ll * pw[n - 2] * (n - c) % Mod * s % Mod + pw[n - 1]) % Mod; if (x == 1) break; x >>= 1, c++; } printf("%d\n", ans); } } namespace sub3 { int cnta[N], cntb[N], cnt[29][29]; void dfs(int l, int r) { if (l >= r) return; int x = (l + r) >> 1; int x1 = (l + x - 1) >> 1, x2 = (r + x + 1) >> 1; if (x1 >= l && x1 <= r) cnta[x1] = cnta[x] + 1, cntb[x1] = cntb[x]; if (x2 >= l && x2 <= r) cnta[x2] = cnta[x], cntb[x2] = cntb[x] + 1; dfs(l, x - 1), dfs(x + 1, r); } void init() { dfs(1, n); for (int i = 1; i <= n; i++) cnt[cnta[i]][cntb[i]]++; } void Main(int x) { int ans = 0, s1 = 1ll * (x + 1 + n) * (n - x) / 2 % Mod; int s2 = 1ll * (x - 1) * x / 2 % Mod; for (int a = 0; a <= 25; a++) { for (int b = 0; b <= 25; b++) { int sum = 0; if (n - x - a >= 0 && x - 1 - b >= 0) { (sum += 1ll * pw[n - x] * ip[n - x - a] % Mod * pw[x - 1] % Mod * ip[x - 1 - b] % Mod * pw[n - a - b - 1] % Mod * x % Mod) %= Mod; } if (n - x - a >= 1 && n - x - 1 >= 0 && x - 1 - b >= 0) { (sum += 1ll * pw[n - x - 1] * ip[n - x - a - 1] % Mod * pw[x - 1] % Mod * ip[x - 1 - b] % Mod * pw[n - a - b - 1] % Mod * s1 % Mod) %= Mod; } if (n - x - a >= 0 && x >= 2 && x - 1 - b >= 1) { (sum += 1ll * pw[n - x] * ip[n - x - a] % Mod * pw[x - 2] % Mod * ip[x - 1 - b - 1] % Mod * pw[n - a - b - 1] % Mod * s2 % Mod) %= Mod; } ans = (ans + 1ll * cnt[a][b] * sum) % Mod; } } printf("%d\n", ans); } } int main() { scanf("%d%d", &n, &q); if (n <= 8 && q <= 8) { sub1::Main(); fclose(stdin); fclose(stdout); return 0; } pw[0] = ip[0] = 1; for (int i = 1; i <= n; i++) pw[i] = 1ll * pw[i - 1] * i % Mod, ip[i] = fpow(pw[i]); sub3::init(); while (q--) { int x; scanf("%d", &x); if (x == 1) sub2::Main(); else sub3::Main(x); } return 0; }


测评信息: