提交时间:2024-07-19 13:55:44
运行 ID: 30411
#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 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 <= 20; a++) { for (int b = 0; b <= 20 - a; b++) { if (!cnt[a][b]) continue; 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); 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); sub3::Main(x); } return 0; }