CSP-S 模擬賽 10


T1 洛谷 U490727 返鄉

思路

首先要意識到一個問題,就是如果所有人總分一定,那么是不會出現偏序的。

可以感性理解一下,就是對于 i,ji, ji,j, 若 ai≤aj,bi≤bja_i \leq a_j, b_i \leq b_jai?aj?,bi?bj?,那么一定會有 ci≥cjc_i \geq c_jci?cj?。然后枚舉方案時,保證不會出現 ai==aj&bi==bja_i == a_j \& b_i == b_jai?==aj?&bi?==bj? 這種情況就行。

然后就是看在總分為多少時,方案數最多。
考試的時候可以先寫一個暴力程序,先枚舉總分 s∈[0,3n]s \in [0, 3n]s[0,3n],然后枚舉前兩科分數 i,j∈[0,n]i, j \in [0, n]i,j[0,n],若算下來第三科成績 s?i?js - i - js?i?j 也小于等于 nnn,那就是一種合法情況,記錄下方案數,最后求最大值。
復雜度 O(3n3)O(3n^3)O(3n3),代碼如下:

#include <bits/stdc++.h>#define mkpr make_pair
#define fir first
#define sec secondusing namespace std;typedef long long ll;const int maxn = 1e6 + 7;
const int inf  = 0x3f3f3f3f;int n, ansc, anss;
int ans[maxn][3];
int main() {scanf("%d", &n);for (int s = 0; s <= 3 * n; ++s) {int cnt = 0;for (int i = 0; i <= n; ++i)for (int j = 0; j <= n; ++j)if (i + j <= s && s - i - j <= n) ++cnt;if (cnt > ansc) {anss = s;  // 記錄下方案最多時的總分,找找規律ansc = cnt;cnt = 0;for (int i = 0; i <= n; ++i)for (int j = 0; j <= n; ++j)if (i + j <= s && s - i - j <= n) {++cnt,ans[cnt][0] = i;ans[cnt][1] = j;ans[cnt][2] = s - i - j;}}}printf("anss:%d, ansc:%d\n", anss, ansc);for (int i = 1; i <= ansc; ++i)printf("%d %d %d\n", ans[i][0], ans[i][1], ans[i][2]);return 0;
}

n≤600n \leq 600n600,由于有常數 333,所以過不去。

然后會有規律:s=3n2s = \frac{3n}{2}s=23n? 時,方案數最多。(筆者有點不太會證,先鴿著。。。)

所以直接用如下代碼:

#include <bits/stdc++.h>#define mkpr make_pair
#define fir first
#define sec secondusing namespace std;typedef long long ll;const int maxn = 1e6 + 7;
const int inf  = 0x3f3f3f3f;int n, ansc;
int ans[maxn][3];
int main() {scanf("%d", &n);for (int i = 0; i <= n; ++i) {for (int j = 0; j <= n; ++j) {int k = n * 3 / 2 - i - j;if (k >= 0 && k <= n) {++ansc;ans[ansc][0] = i;ans[ansc][1] = j;ans[ansc][2] = k;}}}	printf("%d\n", ansc);for (int i = 1; i <= ansc; ++i)printf("%d %d %d\n", ans[i][0], ans[i][1], ans[i][2]);return 0;
}

O(n2)O(n ^ 2)O(n2) 水過。


T2 洛谷 U490729 連接

相當溝槽好的一道題,讓我花了一天改。。。
還是要噴一下題解,高中肄業都寫不出那樣生理紊亂的表達。。。
還好有同機房的大佬給出的解法。

一、15pts15pts15pts 思路(n,li,pi≤10,O((∑i=1nli)2)n, l_i, p_i \leq 10,O((\sum_{i = 1}^{n}l_i)^2)n,li?,pi?10,O((i=1n?li?)2)

可以直接用數組把鋼管模擬出來,處理出質量與長度的前綴和數組后,直接 (∑i=1nli)2(\sum_{i = 1}^{n}l_i)^2(i=1n?li?)2 暴力枚舉求密度。
代碼如下:

int sl, sm[107];
double ans;
void Main() {for (int i = 1; i <= n; ++i) {for (int j = sl + 1; j <= sl + len[i]; ++j)sm[j] = sm[j - 1] + p[i];sl += len[i];}for (int i = 1; i <= sl; ++i) {for (int j = i; j <= sl; ++j) {if (sm[j] - sm[i - 1] >= L && sm[j] - sm[i - 1] <= R)ans = max(ans, 1.0 * (sm[j] - sm[i - 1]) / (j - i + 1));}}printf("%.10lf\n", ans);
}

二、50pts50pts50pts 思路(n≤5000,O(n2)n \leq 5000, O(n^2)n5000,O(n2)

n2n^2n2 的做法要求我們以完整的塊為單位枚舉求解。

思考兩種截取方法,一種是截整塊(即若干個連續的塊完整地截下來),另一種是帶散塊(即兩端的鋼管不會被截完)。

對于前者,依舊用前綴和直接 O(n2)O(n^2)O(n2) 求解。對于后者,要意識到兩件事:

  1. 最多只會有一端是散塊,不會兩端都是散塊:因為在質量允許的范圍內,我們肯定更傾向于去兩端中密度更大的那一個,那樣可以使整體密度更大(這點根據生活經驗或者糖水不等式);
  2. 散塊的質量只會有 LLLRRR:因為如果散塊的密度大,我們肯定希望多取,那就直接取到 RRR,可以使整體密度最大化。如果密度小,那我們肯定希望少取,那就直接取到 LLL,防止其繼續拉低整體密度。

思路大概如此,實現時由于散塊可能是兩端中的任意一個,所以要給 li,pil_i, p_ili?,pi? 數組反轉后再求解一次。枚舉左端點 iii,然后用雙指針或二分查找維護右端點取值范圍,再直接計算散塊密度。

代碼如下:

#include <bits/stdc++.h>using namespace std;typedef long long ll;
typedef double db;const int maxn = 3e5 + 7;int n, len[maxn], p[maxn];
ll L, R, sm[maxn], sl[maxn];
db ans;void solve() {for (int i = 1; i <= n; ++i)sl[i] = sl[i - 1] + len[i],sm[i] = sm[i - 1] + 1ll * len[i] * p[i];//	printf("sl: ");
//	for (int i = 1; i <= n; ++i) printf("%d ", sl[i]);
//	printf("\n");
//	
//	printf("sm: ");
//	for (int i = 1; i <= n; ++i) printf("%d ", sm[i]);
//	printf("\n");// 算一端是散塊的情況int l = 1, r = 0;for (int i = 1; i <= n; ++i) {// 必須滿足質量大于 Lwhile (l <= n && sm[l] - sm[i - 1] < L) ++l;// 這里 r 的判斷條件必須是 r <= n 而不是 r + 1 <= n// 因為后面要判斷質量能不能取到 Rwhile (r <= n && sm[r + 1] - sm[i - 1] < R) ++r;// 再怎么取都無法達到 Lif (l > n) break;// 分子是質量, 分母是長度db pl = 1.0 * L / (sl[l - 1] - sl[i - 1] + (L - (sm[l - 1] - sm[i - 1])) * 1.0 / p[l]);db pr = 1.0 * R / (sl[r - 1] - sl[i - 1] + (R - (sm[r - 1] - sm[i - 1])) * 1.0 / p[r]);// 如果質量取不到 R, 那就不能用 R 為質量來算密度if (r > n) pr = 0.0;ans = max(ans, max(pl, pr));}// 算選的都是整塊的情況for (int i = 1; i <= n; ++i) {for (int j = i; j <= n; ++j) {ll m = sm[j] - sm[i - 1];if (m >= L && m <= R) {ans = max(ans, 1.0 * m / (sl[j] - sl[i - 1]));
//				printf("%lf\n", 1.0 * m / (sl[j] - sl[i - 1]));}else if (m >= L && m > R && i == j)ans = max(ans, p[i] * 1.0);
//			printf("[%d, %d], ans:%lf\n", i, j, ans);}}
}
int main() {
//	freopen("connect2.in", "r", stdin);scanf("%d%lld%lld", &n, &L, &R);for (int i = 1; i <= n; ++i) scanf("%d", len + i);for (int i = 1; i <= n; ++i) scanf("%d", p + i);//	puts("|||||||||||||||||||||||||||||||||||||||||||||");solve();reverse(len + 1, len + n + 1);reverse(p + 1, p + n + 1);
//	puts("|||||||||||||||||||||||||||||||||||||||||||||");solve();printf("%.10lf\n", ans);return 0;
} 

三、正解(O(n×log(max{pi})O(n \times log(max\left \{p_i \right \})O(n×log(max{pi?})

O(n2)O(n^2)O(n2) 的做法在于整塊,所以優化這一部分。

機房大佬給出的解法是先二分密度 midmidmid,然后再 chkchkchk
chkchkchk 函數依舊先枚舉左端點,然后二分查找或雙指針維護右端點取值范圍 [l,r][l,r][l,r],然后再遍歷 [l,r][l, r][l,r],看看其中是否存在一個 jjj 滿足 smj?smi?1slj?sli?1≥mid\frac{sm_j - sm_{i - 1}}{sl_j - sl_{i - 1}} \geq midslj??sli?1?smj??smi?1??mid。但是這樣本質上依舊是 O(n2)O(n^2)O(n2) 暴力。

把判斷式子化簡一下,成這樣:mid×sli?1?smi?1≥mid×slj?smjmid \times sl_{i - 1} - sm_{i - 1} \geq mid \times sl_j - sm_jmid×sli?1??smi?1?mid×slj??smj?。發現我們判斷的是區間中的最小值是否小于 mid×sli?1?smi?1mid \times sl_{i - 1} - sm_{i - 1}mid×sli?1??smi?1?,那就用單調隊列維護最小值就好了。

代碼如下:

#include <bits/stdc++.h>using namespace std;typedef long long ll;
typedef long double ld;
typedef double db;const int maxn = 3e5 + 7;int n, len[maxn], p[maxn];
ll L, R, sm[maxn], sl[maxn];
db ans;int q[maxn], h, t;
bool chk(ld x) {memset(q, 0, sizeof(q));h = 1, t = 0;for (int i = 1, r = 0; i <= n; ++i) {// 單調隊列擴展右區間while (r + 1 <= n && sm[r + 1] - sm[i - 1] <= R) {++r;while (h <= t && x * sl[q[t]] - sm[q[t]] > x * sl[r] - sm[r]) --t;q[++t] = r;}// 把不合法的左區間刪了while (h <= t && sm[q[h]] - sm[i - 1] < L) ++h;if (h > t) continue;// 滿足上述式子if (x * (ld)sl[i - 1] - (ld)sm[i - 1] >= x * (ld)sl[q[h]] - (ld)sm[q[h]])return true;}return false;
}
void solve() {for (int i = 1; i <= n; ++i)sl[i] = sl[i - 1] + len[i],sm[i] = sm[i - 1] + 1ll * len[i] * p[i];// 算一端是散塊的情況for (int i = 1, l = 1, r = 0; i <= n; ++i) {// 單個塊質量就超出 R 的話直接特判 if (sm[i] - sm[i - 1] >= R) {ans = max(ans, p[i] * 1.0);++l, ++r; continue;}while (l <= n && sm[l] - sm[i - 1] < L) ++l;while (r + 1 <= n && sm[r + 1] - sm[i - 1] <= R) ++r;if (l > n) break;db pl = 1.0 * L / (sl[l - 1] - sl[i - 1] + (L - (sm[l - 1] - sm[i - 1])) * 1.0 / p[l]);db pr = 1.0 * R / (sl[r] - sl[i - 1] + (R - (sm[r] - sm[i - 1])) * 1.0 / p[r + 1]);if (r > n) pr = 0.0;ans = max(ans, max(pl, pr));}// 算選的都是整塊的情況db l = 0.0, r = 0.0;for (int i = 1; i <= n; ++i) r = max(r, p[i] * 1.0);while (r - l >= 1e-7) {db mid = (l + r) / 2;if (chk(mid)) l = mid, ans = max(ans, mid);else r = mid;}
}
int main() {
//	freopen("connect2.in", "r", stdin);scanf("%d%lld%lld", &n, &L, &R);for (int i = 1; i <= n; ++i) scanf("%d", len + i);for (int i = 1; i <= n; ++i) scanf("%d", p + i);solve();reverse(len + 1, len + n + 1);reverse(p + 1, p + n + 1);solve();printf("%.10lf\n", ans);return 0;
} 

T3 洛谷 U490735 習慣孤獨

一道這輩子做的最溝施的樹形 dpdpdp,光改題改了我 5h5h5h,代碼 + 注釋 + 調試代碼一共 272 行,寫篇題解發泄一下,希望這題沒白改。

一、暴力思路

直接 dfsdfsdfs,枚舉第 iii 次刪一條邊,然后判斷刪去這條邊后形成的兩個連通塊是否符合要求,
如果符合就直接 dfsdfsdfs 下去,不符合就不管。

理論復雜度是 O(nk)O(n^k)O(nk),但是遠遠跑不滿,因為不合法的刪邊相當多。
考場上有一個人拿這得了 70pts70pts70pts,再次警醒寫暴力的重要性。但我懶得寫了

二、正解

樹上統計方案數一般就是樹形 dpdpdp,樹形 dpdpdp 的精髓就在于分類討論。
首先轉化一下 aia_iai? 的含義,aia_iai? 表示第 iii 刀要砍下的子樹大小,即 ai=ai?1?aia_i = a_{i - 1} - a_iai?=ai?1??ai?

(一) 在以 uuu 為根的子樹內切割

看見 k≤6k \leq 6k6,所以可以用狀態壓縮表示切割狀態。
fu,sf_{u, s}fu,s? 表示以 uuu 為根節點的子樹,切割狀態為 sss 時的方案數。
fu,sf_{u, s}fu,s? 一共有兩部分構成:一是 uuu 的子節點,二是當它自己被劃分到一個連通塊時也有貢獻。

上述情況如下圖:

  1. 子節點 vvv 的貢獻(我們把這部分貢獻記為 gu,sg_{u,s}gu,s?):
  2. uuu 自己也在一個連通塊中:

對于第一種情況,fu,sf_{u, s}fu,s? 的答案就是若干個子樹的方案數的乘積,但是要注意,每個子樹的狀態 SvS_vSv? 并起來要等于 sss,且全部 &\&& 起來要為 000,因為不可能砍同一刀;
對于第二種情況,要先判斷 uuu 所在的連通塊的大小是否符合某一個切割要求,即判斷以 uuu 為根的子樹剩下的大小是否和某個 aia_iai? 相同。需要注意的是,uuu 所在的連通塊必須比它子樹中的連通塊的切割時間要晚。下圖就是一個不合法的情況:
在這里插入圖片描述

(二) 在以 uuu 為根的子樹外切割

在這里插入圖片描述
uuu 子樹以外的部分的貢獻由三部分組成:

  1. uuu 的兄弟節點劃分成的連通塊:
    在這里插入圖片描述

  2. 包含父親節點的連通塊(下面展示一種情況,當然 fafafa 還可能被包含在"上面連著其他部分"的某個連通塊):
    在這里插入圖片描述
    3.在【"上面連著其他部分"且不包含以 fafafa 為根的子樹】的連通塊:
    在這里插入圖片描述

因此設 hu,vh_{u, v}hu,v? 表示在 uuu 子樹以外的部分的方案數。

考慮這部分怎么求:
考慮換根 dpdpdp,那么這部分就可以用 ffaf_{fa}ffa? 減去 fuf_ufu? 的那一部分貢獻來求,但是這一部分貢獻并不好抽離出來(但是為什么我也不太清楚,同機房大佬說是因為這方案數計算的時候實際上是卷積的過程,我也完全不知道是啥),所以考慮正向求解。

  1. 首先是兄弟節點,這部分何以用前后綴來求:prei,spre_{i, s}prei,s? 表示 uuu 的前 iii 個兄弟節點的切割狀態并集sss 時的方案數,sufi,ssuf_{i, s}sufi,s? 表示第 iii 個兄弟節點到最后一個兄弟節點的切割狀態并集為 sss 的方案數,那么這部分貢獻就是 hu,s1∣s2=prei?1,s1×sufi+1,s2h_{u, s1 | s2} = pre_{i-1, s1} \times suf_{i + 1, s2}hu,s1∣s2?=prei?1,s1?×sufi+1,s2?s1&s2=0s1 \& s2 = 0s1&s2=0uuu 就是第 iii 個兄弟節點);
  2. 其次是父親節點的貢獻:這部分求法和在【求 fuf_ufu?uuu 本身屬于一個連通塊的貢獻】的方法一樣;
  3. 最后是 fafafa 以外的貢獻:fafafa 以外的貢獻實際上就是 hfah_{fa}hfa?,將它與 huh_uhu? 合并就行。

最后答案是 ∑i=1n∑s=02k?1gi,s×hi,(2k?1)⊕s\sum_{i = 1}^{n} \sum_{s = 0} ^ {2^k - 1} g_{i, s} \times h_{i, (2^k - 1) \oplus s}i=1n?s=02k?1?gi,s?×hi,(2k?1)s?,但是還要除以 aka_kak?,因為我們是欽定 iii 在最后一個連通塊中,會有 aka_kak? 個點記錄同一種情況。

代碼如下:

#include <bits/stdc++.h>using namespace std;typedef long long ll;const int maxn = 5e3 + 7;
const int maxs = (1 << 6) + 7;
const int mod  = 998244353;// 注: 下面所說的 "子節點的子樹" 指的是 "【以 u 的子節點】為根的子樹"int n, m, ms, a[10];
vector<int> e[maxn];int siz[maxn];ll f[maxn][maxs];  // f[u][s] 表示以 u 為根節點的子樹(且【包含 u 節點】)切的狀態為 s 時的方案數 
ll g[maxn][maxs];  // g[u][s] 表示以 u 為根節點的子樹(且【不包含 u 節點】)切的狀態為 s 時的方案數
ll tmp[maxs];void dfs1(int u, int fa) {// 沒切割也算一種方案 siz[u] = f[u][0] = 1;int fid = -1;  // 記錄父節點在 e[u] 中的下標// f[u] 由兩部分組成, 一個是其子節點子樹的貢獻(其實就是 g[u]), 一個是其本身被包含到一個連通塊的貢獻// 下面這部分求的是其 g[u] 的部分for (int i = 1; i <= e[u].size(); ++i) {int v = e[u][i - 1];if (v == fa) {fid = i - 1; continue;}dfs1(v, u), siz[u] += siz[v];// 記錄前 i - 1 棵子節點子樹【不同切割狀態下】的貢獻// 等會用于合并for (int s = 0; s <= ms; ++s)tmp[s] = f[u][s], f[u][s] = 0;// 枚舉前 i - 1 棵子節點子樹切割狀態的【并集】 // 并將其與第 i 棵合并for (int si = 0; si <= ms; ++si) {int sj = ms ^ si;  // 由于不可能砍同一刀, 所以 si & sk 必須等于 0 for (int sk = sj; ; sk = (sk - 1) & sj) {f[u][si | sk] = (f[u][si | sk] + tmp[si] * f[v][sk] % mod) % mod;if (!sk) break;}}}// 父邊沒用就刪了 if (fid != -1) e[u].erase(e[u].begin() + fid);// 記錄子節點的貢獻for (int s = 0; s <= ms; ++s)g[u][s] = f[u][s];// 現在計算 u 本身被包含到一個連通塊的貢獻for (int si = 0; si <= ms; ++si) {  // 枚舉其所有子節點子樹的切割狀態的【并集】 int cut = 0;  // 記錄子節點子樹中被砍去的大小for (int j = 1; j <= m; ++j)if ((si >> (j - 1)) & 1) cut += a[j]; int rest = siz[u] - cut;  // 剩下的節點數 // 枚舉 u 可能會被哪些連通塊包含// 這里必須倒序枚舉, 因為【包含 u 的連通塊】必須比【子節點子樹的連通塊】切得晚 for (int j = m; j; --j) {if ((si >> (j - 1)) & 1) break;  // 不能繼續枚舉比子節點子樹中【最晚的連通塊】更早的連通塊 if (rest == a[j]) f[u][si | (1 << (j - 1))] = (f[u][si | (1 << (j - 1))] + g[u][si]) % mod;}}
}ll pre[maxn][maxs];  // pre[i][s] 表示 u 的前 i 個子樹的切割狀態為 s 時的方案數
ll suf[maxn][maxs];  // suf[i][s] 表示 u 的第 i 個子節點到最后一個子節點的切割狀態為 s 時的方案數
ll h[maxn][maxs];  // h[u][s] 表示除【以 u 為根節點的子樹】以外其他部分的貢獻 
void dfs2(int u) {for (int i = 0; i <= e[u].size() + 1; ++i)for (int s = 0; s <= ms; ++s)pre[i][s] = suf[i][s] = 0;pre[0][0] = suf[e[u].size() + 1][0] = 1;for (int i = 1; i <= e[u].size(); ++i) {int v = e[u][i - 1];for (int si = 0; si <= ms; ++si) {  // 枚舉前 i - 1 個子節點子樹的切割狀態并集 int sj = si ^ ms;for (int sk = sj; ; sk = (sk - 1) & sj) {  // 枚舉第 i 個子節點子樹切割狀態 pre[i][si | sk] = (pre[i][si | sk] + pre[i - 1][si] * f[v][sk] % mod) % mod;if (!sk) break;}}}for (int i = e[u].size(); i; --i) {int v = e[u][i - 1];for (int si = 0; si <= ms; ++si) {int sj = si ^ ms;for (int sk = sj; ; sk = (sk - 1) & sj) {suf[i][si | sk] = (suf[i][si | sk] + suf[i + 1][si] * f[v][sk] % mod) % mod;if (!sk) break;}}}// h[v][s] 貢獻來自三部分for (int i = 1; i <= e[u].size(); ++i) {int v = e[u][i - 1];// 1. v 的兄弟節點for (int si = 0; si <= ms; ++si) {  // 枚舉前綴兄弟節點的切割狀態的【并集】 int sj = ms ^ si;for (int sk = sj; ; sk = (sk - 1) & sj) {  // 枚舉后綴兄弟節點的切割狀態的【并集】h[v][si | sk] = (h[v][si | sk] + pre[i - 1][si] * suf[i + 1][sk] % mod) % mod;if (!sk) break;}}// 2. v 的父親節點以外的for (int s = 0; s <= ms; ++s)tmp[s] = h[v][s], h[v][s] = 0;for (int si = 0; si <= ms; ++si) {  // 枚舉【除【以 u 為根節點的子樹】以外】的部分的切割狀態并集 int sj = si ^ ms;for (int sk = sj; ; sk = (sk - 1) & sj) {h[v][si | sk] = (h[v][si | sk] + h[u][si] * tmp[sk] % mod) % mod;if (!sk) break;}}// 3. v 的父親節點(就是把 (u, v) 斷開后, 產生的包含 u 的連通塊的貢獻) for (int s = 0; s <= ms; ++s) tmp[s] = h[v][s];// 這里枚舉的實際上是: 整棵樹中【除以 u 為根的子樹以外部分】和【v 的兄弟節點子樹】的切割狀態 for (int sj = 0; sj <= ms; ++sj) {int cut = 0;for (int j = 1; j <= m; ++j)if ((sj >> (j - 1)) & 1) cut += a[j];int rest = n - siz[v] - cut;for (int j = m; j; --j) {if ((sj >> (j - 1)) & 1) break;if (rest == a[j]) h[v][sj | (1 << (j - 1))] = (h[v][sj | (1 << (j - 1))] + tmp[sj]) % mod;}}}for (int v : e[u]) dfs2(v);
}
ll qpow(ll x, ll y) {ll res = 1;for (; y; y >>= 1, x = x * x % mod)if (y & 1) res = res * x % mod;return res;
}
int main() {scanf("%d", &n);for (int i = 1, u, v; i < n; ++i) {scanf("%d%d", &u, &v);e[u].push_back(v);e[v].push_back(u);}scanf("%d", &m), ms = (1 << m) - 1;for (int i = 1; i <= m; ++i) scanf("%d", a + i);a[0] = n;for (int i = m + 1; i; --i)a[i] = a[i - 1] - a[i];  // a[i] 表示第 i 次切割時需要切去的子樹大小// a[k] 還要保留下來, 等會統計答案時還要用dfs1(1, 0);h[1][0] = 1;dfs2(1);ll ans = 0;for (int i = 1; i <= n; ++i) {for (int s = 0; s <= ms; ++s) tmp[s] = 0;for (int si = 0; si <= ms; ++si) {int sj = ms ^ si;for (int sk = sj; ; sk = (sk - 1) & sj) {tmp[si | sk] = (tmp[si | sk] + g[i][si] * h[i][sk] % mod) % mod;if (!sk) break;}}ans = (ans + tmp[ms]) % mod;}// 由于在統計答案時, 我們欽定 i 留在最后一個塊中// 所以會有 a[k] 個點記錄的是同一個方案// 所以答案要除以 a[k]printf("%lld\n", ans * qpow(a[m + 1], mod - 2) % mod);return 0;
}

時間復雜度是 O(n×22k)O(n \times 2^{2k})O(n×22k).


T4 車站

是最小樹形圖,不會先不改。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/914205.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/914205.shtml
英文地址,請注明出處:http://en.pswp.cn/news/914205.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

CMD,PowerShell、Linux/MAC設置環境變量

以下是 CMD&#xff08;Windows&#xff09;、PowerShell&#xff08;Windows&#xff09;、Linux/Mac 在 臨時/永久 環境變量操作上的對比表格&#xff1a;環境變量操作對照表&#xff08;CMD vs PowerShell vs Linux/Mac&#xff09;操作CMD&#xff08;Windows&#xff09;P…

MySQL(131)如何解決MySQL CPU使用率過高問題?

解決MySQL CPU使用率過高的問題需要從多個方面進行排查和優化&#xff0c;包括查詢優化、索引優化、配置優化和硬件資源的合理使用等。以下是詳細的解決方案和相應的代碼示例。 一、查詢優化 1. 檢查慢查詢 使用MySQL的慢查詢日志來找到執行時間長的查詢。 SET GLOBAL slow_que…

docker基礎與常用命令

目錄 一.docker概述 1.docker與虛擬機區別 2.Linux 六大命名空間 3.Docker 的核心技術及概念 二.docker部署安裝 三.docker常用命令 1.搜索鏡像 2.獲取鏡像 3.查看鏡像信息 4.添加鏡像標簽 5.刪除鏡像 6.存出與載入鏡像 7.上傳鏡像 8.創建容器 9.查看容器狀態 1…

Cypress與多語言后端集成指南

Cypress 簡介 基于 JavaScript 的前端測試工具,可以對瀏覽器中運行的任何內容進行快速、簡單、可靠的測試Cypress 是自集成的,提供了一套完整的端到端測試,無須借助其他外部工具,安裝后即可快速地創建、編寫、運行測試用例,且對每一步操作都支持回看不同于其他只能測試 UI…

計算機畢業設計ssm基于JavaScript的餐廳點餐系統 SSM+Vue智慧餐廳在線點餐管理平臺 JavaWeb前后端分離式餐飲點餐與桌臺調度系統

計算機畢業設計ssm基于JavaScript的餐廳點餐系統0xig8788&#xff08;配套有源碼 程序 mysql數據庫 論文&#xff09; 本套源碼可以在文本聯xi,先看具體系統功能演示視頻領取&#xff0c;可分享源碼參考。掃碼點單、手機支付、后廚實時出票已經成為食客對餐廳的基本預期。傳統的…

wedo稻草人-----第32節(免費分享圖紙)

夸克網盤&#xff1a;https://pan.quark.cn/s/ce4943156861 高清圖紙源文件&#xff0c;需要的請自取

Jmeter函數的使用

函數名作用用法${__Random(,,)}${__RandomString(,,)}隨機生成一些東西${__Random(000,999,)} ${__Random(${test1},${test2},)}${__RandomString(${__Random(3,9,)},asdfghjkl,)}${__time(,)}獲取當前的時間戳&#xff0c;也可以定義格式${__CSVRead(,)}讀取CSV文件的格式&…

Windows 用戶賬戶控制(UAC)繞過漏洞

漏洞原理CVE-2021-31199 是一個 Windows 用戶賬戶控制&#xff08;UAC&#xff09;繞過漏洞&#xff0c;CVSS 3.1 評分 7.8&#xff08;高危&#xff09;。其核心原理如下&#xff1a;UAC 機制缺陷&#xff1a;Windows UAC 通過限制應用程序權限提升系統安全性&#xff0c;但某…

comfyUI-controlNet-線稿軟邊緣

{WebUI&comfyUI}∈Stable Diffuision&#xff0c;所以兩者關于ContrlNet的使用方法的核心思路不會變&#xff0c;變的只是comfyUI能夠讓用戶更直觀地看到&#xff0c;并且控制生圖的局部過程。 之前的webUI中涉及到ContrlNet部分知識&#xff1a;SD-細節控制-CSDN博客 概…

SOEM build on ubuntu

1.配置 soem2.編譯 soem3.結果4.記錄一下自己的開發環境家里臺式機

STM32--USART串口通信的應用(第一節串口通信的概念)

咱們今天呢給大家講解咱們 stm32 開發當中的串口的應用啊 &#xff0c; 串口這個專題呢啊是我們那 個學習上必須要掌握的一個外設串口有什么作用呢&#xff0c;其實在我們以后的這個開發程序當中&#xff0c;咱們可能經常需要用到一些調試 信息&#xff0c;對吧&#xff1f; 啊…

STM32F407ZGT6天氣時鐘+實時溫濕度顯示(附源碼)

文章目錄實現功能&#xff1a;項目展示&#xff1a;代碼解析&#xff1a;實現功能&#xff1a; 1.主要功能&#xff1a;通過485通信獲取傳感器溫濕度&#xff0c;溫濕度數據顯示、實時時鐘顯示與用戶交互。使用LVGL在顯示屏上展示傳感器溫濕度數據&#xff0c;并提供UI設置溫度…

和鯨社區深度學習基礎訓練營2025年關卡4

使用 pytorch 構建一個簡單的卷積神經網絡&#xff08;CNN&#xff09;模型&#xff0c;完成對 CIFAR-10 數據集的圖像分類任務。 直接使用 CNN 進行分類的模型性能。 提示&#xff1a; 數據集&#xff1a;CIFAR-10 網絡結構&#xff1a;可以使用 2-3 層卷積層&#xff0c;ReLU…

前端性能優化全攻略:從加載到渲染

目錄 前言網絡請求優化資源加載優化JavaScript執行優化渲染優化用戶體驗優化性能監控與分析總結 前言 隨著Web應用復雜度不斷提升&#xff0c;前端性能優化變得尤為重要。本文將系統性地介紹從資源加載到頁面渲染的全鏈路性能優化策略&#xff0c;幫助開發者構建高效、流暢的…

hiredis: 一個輕量級、高性能的 C 語言 Redis 客戶端庫

目錄 1.簡介 2.安裝和配置 2.1.源碼編譯安裝&#xff08;通用方法&#xff09; 2.2.包管理器安裝&#xff08;特定系統&#xff09; 2.3.Windows 安裝 3.常用的函數及功能 3.1.連接管理函數 3.2.命令執行函數 3.3.異步操作函數 3.4.回復處理函數 3.5.錯誤處理 3.6.…

TCP套接字

1.概念套接字是專門進行網絡間數據通信的一種文件類型&#xff0c;可以實現不同主機之間雙向通信&#xff0c;包含了需要交換的數據和通信雙方的IP地址和port端口號。2.套接字文件的創建int socket(int domain, int type, int protocol); 功能&#xff1a;該函數用來創建各種各…

Go語言高并發聊天室(一):架構設計與核心概念

Go語言高并發聊天室&#xff08;一&#xff09;&#xff1a;架構設計與核心概念 &#x1f680; 引言 在當今互聯網時代&#xff0c;實時通信已成為各類應用的核心功能。從微信、QQ到各種在線協作工具&#xff0c;高并發聊天系統的需求無處不在。本系列文章將手把手教你使用Go語…

Java基礎:泛型

什么是泛型&#xff1f; 簡單來說&#xff0c;Java泛型是JDK 5引入的一種特性&#xff0c;它允許你在定義類、接口和方法時使用類型參數&#xff08;Type Parameters&#xff09;。這些類型參數可以在編譯時被具體的類型&#xff08;如 String, Integer, MyCustomClass 等&…

RMSNorm實現

當前Qwen、Llama等系列RMSNorm實現源碼均一致。具體現實如下&#xff1a; class RMSNorm(nn.Module):def __init__(self, hidden_size, eps1e-6):super().__init__()self.weight nn.Parameter(torch.ones(hidden_size))self.variance_epsilon epsdef forward(self, hidden_s…

智能Agent場景實戰指南 Day 11:財務分析Agent系統開發

【智能Agent場景實戰指南 Day 11】財務分析Agent系統開發 文章標簽 AI Agent,財務分析,LLM應用,智能財務,Python開發 文章簡述 本文是"智能Agent場景實戰指南"系列第11篇&#xff0c;聚焦財務分析Agent系統的開發。文章深入解析如何構建一個能夠自動處理財務報表…