如果让现在的部分主流 LLM 模型做 SCP-S?

· · 个人记录

Chatgpt-4o(64 分)

选择题/18 分

以下是各题的答案和解释:

  1. *B. g++ -std=c++14 -O2 -o luogu.cpp**

    • 传统型试题使用的是C++编译器g++,一般使用标准C++14,并且为了优化运行速度通常会使用-O2优化选项。
  2. C. 小黄提交的程序在考场的Windows电脑上正常编译,而在最终评测时编译失败。

    • 如果考场和评测环境存在差异导致编译失败,申诉可能被接受。
  3. B. Stable Diffusion

    • Stable Diffusion 是生成图像的扩散模型,不属于大型语言模型(LLM)。
  4. D. (\left(2D\right)_{16})

    • (47{10})转换为十六进制是(2D{16})。
  5. A. 11

    • 13在模29下的乘法逆元为11,因为 (13 \times 11 \equiv 1 \mod 29)。
  6. B. 6561

    • 这是 (1 + x + x^2)^8 的所有系数的和,即 (3^8 = 6561)。
  7. A. 左子树的某一叶子结点

    • 新结点的关键字小于根结点,则将插入左子树中最底层的一个位置,即成为叶子结点。
  8. B. 24/91

    • 概率计算为 \frac{\binom{4}{1}\binom{5}{1}\binom{6}{1}}{\binom{15}{3}} = \frac{24}{91}
  9. A. 8

    • 前缀表达式- + 10 * 2 3 + 5 / 6 2的求值过程为8。
  10. C. 17

    • 队列当前长度为((3 + 21 - 8)\% 21 = 16) + 1 = 17。
  11. D. 以上排序算法的运行时间复杂度均与整数大小有关

    • 基数排序和计数排序的时间复杂度都与整数的范围有关。
  12. C. 执行代码cout << sizeof(a);后,输出的结果为4。

    • sizeof(int)在32位和64位系统上通常都是4字节。
  13. D. \Theta(n\log^3n)

    • 函数calc的递归复杂度为\\Theta(n\log^3n)\。
  14. B. 图G不是点双连通的,因为存在割点。

    • 在给定的无向图中,顶点B和C是割点。
  15. C. f(x)=\lfloor100\lg x\rfloor

    • 这种哈希函数可以有效地减少冲突,因为它使用了对数函数对值进行缩放。

阅读程序/25 分

  1. ×

    • s1s2 的内容是相同的,尽管初始化时顺序不同,但 set 会自动排序。因此,s1 == s2 返回 true,即 1
  2. ×

    • intersection 函数的时间复杂度是 (\Theta(\min(p, q))),其中 (p) 和 (q) 分别为集合 ab 的大小。不会涉及到 log 复杂度。
    • 使用 rbegin() 会从 mp1 的尾部开始遍历集合,可能会导致不同的交集结果,因此输出可能会改变。
    • autopair<set<int>, int> 在这个上下文中指向相同的类型,所以结果不变。
  3. D. 1 0 0

    • 第一部分:比较 mp1mp2 的键值,mp1 < mp2true
    • 第二部分:mp2[s3] 返回 0,因为 s3 没有在 mp2 中出现。
    • 第三部分:mp1 <= mp2true
  4. C. (\Theta(nL\log{L}))

    • 遍历所有输入集合,每个集合的插入和查找操作都有 (\log L) 复杂度,因此总复杂度为 (\Theta(nL\log L))。
    • functionUnknown 的返回值只有两种可能性:01。返回值为 -1 是不可能的。
    • k=1 时,输出的数值将是 t * a[0] 的形式,因为多项式只含一个系数。
    • 改变这行代码会影响到 b 数组的排列,从而影响程序输出。
  5. C. (\Theta(n!n^2))

    • 结合 do-whilefindfa 的调用次数,总复杂度为 (\Theta(n!n^2))。
  6. C. 0 15 30 477 2940

    • 对应的输出结果为 0 15 30 477 2940
  7. A. next_permutation

    • functionUnknown 的功能类似于 next_permutation,用于生成下一个字典序的排列。
    • r 的输入为 -1(即 2^{32}-1),范围 lr 包括了所有可能的 unsigned int 值,程序将搜索所有可能的值,如果没有找到匹配的值,则不会输出任何数字。
    • iunsigned int 时,如果 r 大于 l 的最大 unsigned int 值,程序可能陷入死循环,导致无法结束。
    • f(i) == y 的解不可能超过一个,输出的数字最多只有一个。
  8. A. 0

    • 随机选择的 x 满足 f(x) = g(x) 的概率非常低,接近 0
  9. B. (\Theta(\log{n}))

    • 最小的 T(n) 是 (\Theta(\log{n})),因为可以使用分治算法减少 n 的规模。
  10. D. 10

    • 当输入为 50 1 4294967295 时,程序计算的第一个输出值为 10

完善程序/21 分

(1)最小垄断集问题

  1. B. is[k] == 0

    • 在遍历图时,只有当当前节点 k 未被访问(即 is[k] == 0)时才继续执行后续操作。
  2. A. {0, 0, 0}

    • cnt 数组用于统计当前连通分量中两种颜色节点的数量,初始值应为 {0, 0, 0}
  3. B. 3 – is[q.front()]

    • 在图的染色过程中,is[to] 应该为与 is[q.front()] 相反的颜色,故填 3 - is[q.front()]
  4. A. is[to] == is[q.front()]

    • 如果当前节点和相邻节点的颜色相同,则说明图不是二分图,输出 "No such subset."。
  5. C. min(cnt[1], cnt[2])

    • 取当前连通分量中较小的一种颜色的数量,加入到最终的计数 tot 中。

(2)最长公共前缀问题

  1. D. s[a[i]][p] ? s[a[i]][p] - 'a' + 1 : 0

    • 将字符串的第 p 个字符映射为 [1, 26] 的整数值,若字符不存在(即字符串较短),则映射为 0
  2. A. tmp[ch][tail[ch]++] = a[i]

    • 将当前字符串的索引存入对应字符的桶中,并更新桶内元素的数量。
  3. B. ans = (ans + 1ll p tail[j] % mod) % mod

    • 在计算贡献时,当前的公共前缀长度为 p,需乘以 tail[j] 中的数量,并取模。
  4. A. ans = (ans + dfs(pos + 1, pos + tail[i], p + 1)) % mod

    • 递归处理当前桶内的字符串,处理下一个字符位置 p + 1 的公共前缀。
  5. B. dfs(1, n, 0)

    • 从索引 1 开始,到 n 结束,处理所有字符串的公共前缀,初始深度 p0

Chatgpt-4o mini(51 分)

选择题/14 分

  1. B. g++ -std=c++14 -O2 -o * luogu.cpp 是编译C++代码时的标准命令。
  2. C. 如果在考场的Windows电脑上正常编译而最终评测时编译失败,可能是因为环境不同导致的编译问题。
  3. B. Stable Diffusion 是生成图像的模型,不属于大型语言模型(LLM)。
  4. D. \left(2D\right)_{16} 表示47的十六进制数。
  5. D. 13在模29意义下的乘法逆元是9(通过扩展欧几里得算法或穷举法求解)。
  6. C. T_8^0 + T_8^1 + T_8^2 + \ldots + T_8^{16} 的值等于 3^8 = 6561
  7. A. 在二叉排序树中插入一个新结点,若关键字小于根结点的关键字,则新结点将成为根结点的左子树的某一叶子结点。
  8. B. 从盒子里随机抽取3个球,其中恰好有1个红球、1个蓝球和1个绿球的概率是 ( \frac{24}{91} )。
  9. B. 对前缀表达式 - + 10 * 2 3 + 5 / 6 2 进行求值,结果是9。
  10. C. 循环队列长度的计算为 (21 + 3 - 8) % 21 = 16。
  11. A. 基数排序的运行时间复杂度与整数大小无关。
  12. D. for (unsigned i = a; i < b; i++) 可能是一个死循环,因为 a 是有符号整型,可能是负数。
  13. C. calc 函数的时间复杂度是 ( \Theta(n \log^2 n) )。
  14. B. 图G不是点双连通的,因为存在割点(例如C)。
  15. B. 哈希函数 f(x)=\lfloor\sqrt{x}\rfloor 能够避免哈希冲突。

阅读程序/19 分


  1. s1s2 具有相同的元素(集合是无序且不重复的),因此 s1 == s2 输出 1mp1mp2 中的键值对比较结果是 0(因为 s3s2 不相等),mp2[s3]s3 的键值对没有对应值,默认是 0mp1 <= mp2 也是 0

  2. intersection 函数时间复杂度是 (O(\min(p, q) \log \max(p, q))),其中 pq 是集合 ab 的元素个数。

  3. 使用 begin() 返回的是从小到大的顺序,而 rbegin() 返回的是从大到小的顺序。更改为 rbegin() 会改变遍历顺序,结果可能会不同。

  4. 使用 autopair <set<int>, int> 在这里结果不变,因为我们只是遍历 mp1 中的元素。
  5. C. 0 1 1
    • s1s2 不相等,所以 0mp1 < mp21,因为 mp1 的键比 mp2 的键小。mp2[s3]0,因为 s3mp2 中没有键值对。mp1 <= mp2 结果是 1mp1 是空的,满足子集条件)。
  6. C. (\Theta(nL \log L))
    • 复杂度考虑了处理每个集合和每个元素的情况,最坏情况下是 (\Theta(nL \log L))。

  7. functionUnknown 函数的返回值一定会是 01,不会返回 -1,因为在 n01 时会直接返回 0,其他情况下都有返回。

  8. k = 1 时,F(x) 是线性的,ans[m]t \times a[0] 形式的整数。

  9. b[m - 1] = m - 1 会改变排列的生成方式,从而改变程序输出的结果。
  10. B. (\Theta(n!n))
    n! 个排列中,每个排列中 findfa 被调用的次数是 (O(n)),因此总复杂度为 (\Theta(n!n))。
  11. A. 0 15 30 261 1500
    运行程序进行计算可以得到这个结果。
  12. A. next_permutation
    functionUnknown 函数功能与 next_permutation 类似。

  13. lr 为负值范围不在有效范围内,因此不会有输出。

  14. 如果 i 的类型是 unsigned int,当 i 趋近于 r 时,会导致 i 永远不会超出范围,因此程序可能无法结束。

  15. 对于有效范围内的输入,输出数字的个数受限于 lr,不会超过一个。
  16. B. (\frac{1}{15})
    通过分析 f(x) = g(x) 可能性的数量和总数,最小差值是 (\frac{1}{15})。
  17. B. (\Theta(\log n))
    因为每次应用函数 f 是线性的,最优的算法复杂度是 (\Theta(\log n))。
  18. B. 8
    通过给定的 y, l, rf(i) 满足条件的第一个值模 118

完善程序/18 分

(1)最小垄断集问题

  1. 34. ①处应填:
    B. is[k] == 0

    • 需要确保每个节点 k 只在第一次访问时才处理,因此应检查 is[k] 是否为 0
  2. 35. ②处应填:
    A. {0, 0, 0}

    • cnt 数组用来统计两个集合的大小以及一个可能的第三个状态。初始化为 {0, 0, 0}
  3. 36. ③处应填:
    B. 3 - is[q.front()]

    • 使用 3 - is[q.front()] 是为了确保每个节点的状态与其相邻节点的状态不同,且 is[q.front()] 可能为 01
  4. 37. ④处应填:
    A. is[to] == is[q.front()]

    • 如果相邻的两个节点 toq.front() 状态相同,则违反了二分图的条件,应该报告不存在垄断集。
  5. 38. ⑤处应填:
    B. min(cnt[0], cnt[1])

    • 在每个连通分量中,最小的垄断集可以由 min(cnt[0], cnt[1]) 个节点组成,其中 cnt[0]cnt[1] 分别是两个状态的节点数。

(2)最长公共前缀问题

  1. 39. ①处可以填:
    D. s[a[i]][p] ? s[a[i]][p] - 'a' + 1 : 0

    • s[a[i]][p] 表示当前字符的索引,如果存在字符,则将其转化为 025 之间的值,并加 1
  2. 40. ②处应填:
    A. tmp[ch][tail[ch]++] = a[i]

    • 将索引 a[i] 存储在 tmp[ch] 中,并更新 tail[ch] 的位置。
  3. 41. ③处应填:
    B. ans = (ans + 1ll * p * tail[j] % mod) % mod

    • 在计算 ans 时,每个前缀长度 p 对应 tail[j] 的贡献是 p * tail[j]
  4. 42. ④处应填:
    A. ans = (ans + dfs(pos + 1, pos + tail[i], p + 1)) % mod

    • 递归调用 dfs 函数以处理当前段的前缀部分,更新 ans
  5. 43. ⑤处应填:
    B. dfs(1, n, 0)

    • 从字符串的第一条到最后一条,计算所有符合条件的最长公共前缀。

Gemini(47 分)

来自 @rui_er

选择题/16 分

BCBBA
BABAC
BBCB#(没有完全避免冲突的选项,但 A. f(x)=x mod 17 是一个相对较好的选择)

阅读程序/19 分

TTFTBC
TTTBAA
TTFBB#(这道题需要具体的计算才能得出答案)

完善程序/12 分

BABAB
BABAA

文心一言 3.5(35 分)

解析复制下来格式很乱,故直接给出答案。

选择题/16 分

BDBBA BAACA BCCBA

阅读程序/13 分

TFTTBC FTTADA FTFABC

完善程序/6 分

BADAA CAAAA

Kimi(打开联网,28 分)

选择题/12 分

  1. *B. g++ -std=c++14 -O2 -o luogu.cpp* C++ 程序通常使用 g++ 来编译,-std=c++14 指定使用 C++14 标准,-O2 表示优化级别,`-o ` 表示输出文件名由源文件名决定。

  2. C. 小黄提交的程序在考场的Windows电脑上正常编译,而在最终评测时编译失败。 如果程序在考试环境中正常编译但在评测环境中编译失败,这可能是由于环境差异导致,CCF NOI竞赛委员会可能会考虑这种情况。

  3. B. Stable Diffusion Stable Diffusion 是一种生成模型,但它不是大型语言模型(LLM),因为它不专门用于生成或理解自然语言文本。

  4. D. \left(2D\right)_{16} (47{10} = 2D{16}),因为 (4 \times 16^1 + 13 \times 16^0 = 64 + 13 = 77),而 (77) 在十六进制中表示为 (4D)。

  5. C. 8 要找到13在模29意义下的乘法逆元,需要解同余方程 (13x \equiv 1 \pmod{29})。通过尝试或使用扩展欧几里得算法,可以找到 (x = 8)。

  6. B. 6561 (T_8^0) 到 (T_8^{16}) 的和实际上是 ((1+x+x^2)^8) 在 (x=1) 时的值,即 (3^8),等于 (6561)。

  7. A. 左子树的某一叶子结点 如果新结点的关键字小于根结点的关键字,它将被插入到根结点的左子树中。

  8. A. 136/455 这是一个组合问题,需要计算从不同颜色的球中各取一个的组合数,然后除以从15个球中取3个的组合数。

  9. C. 10 根据前缀表达式的计算规则,先计算乘法和除法,然后是加法。计算结果是 (10 + (2 \times 3) + (5 / 6) = 10 + 6 + 0.8333... \approx 16.8333...),但选项中没有这个值,可能是题目或选项有误。

  10. B. 6 如果头指针指向下标8,尾指针指向下标3,且队列不浪费空间,则队列长度为 ((3 - 8 + 21) \% 21 = 6)。

  11. B. 计数排序 计数排序的时间复杂度与整数的大小无关,只与整数的数量和范围有关。

  12. D. for (unsigned i = a; i < b; i++) 可能是一个死循环。 如果 ab 都是负数,unsigned 类型的 i 将从 a 的正值开始,永远无法达到 b

  13. C. \Theta\left(n\log^2{n}\right) calc 函数是一个分治算法,每次递归调用两次 calc 然后调用一次 valval 函数的时间复杂度是 (O(n)),而 calc 函数的递归树的深度是 (O(\log n)),因此总的时间复杂度是 (O(n \log^2 n))。

  14. B. 图G不是点双连通的,因为存在割点。 顶点C是割点,因为删除C后,图不再连通。

  15. D. f\left(x\right)=x^2\ mod\ 13 选项D的哈希函数将每个元素映射到一个不同的值,从而避免哈希冲突。其他选项的哈希函数可能会导致冲突。

阅读程序/13 分

16. 代码运行后,输出的第一行是0。( 正确 ) s1s2 相等,因为集合中元素的顺序不重要,所以 s1 == s2 返回 true,但 cout 打印的是 0

17. 设集合a,b的元素个数分别为p,q,则执行函数intersection(a,b)的时间复杂度为 (\Theta(\min{\left(p,q\right)}\log{\max{\left(p,q\right)}}))。( 错误 ) intersection 函数的时间复杂度应该是 (\Theta(\min(p, q))),因为 count 操作是 (O(1)),erase 操作是 (O(\log n)),但这里 n 是集合中元素的数量,不是集合大小的对数。

18. 将第32行的begin()换成rbegin(),运行结果可能改变。( 错误 ) begin()rbegin() 在这里不会影响结果,因为 mp1 是一个 map,其迭代器是唯一的,并且 map 的元素是唯一的,所以 begin()rbegin() 都将指向同一个元素。

19. 将第33行的auto换成pair <set <int>, int>,运行结果不变。( 正确 ) autopair<set<int>, int> 在这里等价,因为 mp1.begin()->first 已经明确了类型。

20. 输出的第二行是( C. 0 1 1 ) mp1 < mp2 比较的是 map 的序,由于 mp1 只有两个元素,而 mp2 有三个,所以 mp1 < mp2 返回 true,即 1mp2[s3] 没有定义,所以是未定义行为,但根据 map 的行为,如果 s3 不存在则返回 0mp1 <= mp2 也是 true,即 1

21. 记所有输入的l之和为L,则该程序最坏情况下的时间复杂度是( C. (\Theta(nL\log{L})) ) 最坏情况下,每个 l 都达到最大值1000,每个 t 都需要插入到 set 中,并且 intersection 函数会被调用多次,所以时间复杂度与 nL 都有关。

22. functionUnknown 函数的返回值不可能为 -1。( 错误 ) 函数 functionUnknown 没有返回 -1 的逻辑,所以这个判断是错误的。

23. 当输入的k=1时,输出的数值均能表示为 ( t \times a[0] ) 的形式,其中 t 是一个整数。( 正确 )k=1 时,ans[m] 只会累加 F(res),而 F(res) 只与 a[0] 有关。

24. 如果把第34行整行改为 b[m - 1] = m - 1,则程序输出将会被改变。( 正确 ) 这会改变 b 数组的最后一个元素,从而影响 findfa 函数的调用结果,进而影响最终的输出。

25. 在主函数中,findfa函数被调用的次数与以下哪个选项同阶( C. (\Theta(n!n^2)) ) findfa 在一个排列的所有元素上调用,对于每个元素,最坏情况下可能调用 n 次,而排列的数量是 n!,所以总次数是 n! * n,但考虑到 findfa 函数内部的优化,实际次数会少一些,但仍然是 n!n^2 的阶。

26. 对于以下的输入数据,输出结果为( A. 0 15 30 261 1500 ) 这个结果取决于 F(res) 的计算和 ans[m] 的累加,具体结果需要实际运行程序来确定。

27. functionUnknown 的功能接近于 C++ STL 库中的以下( A. next_permutation )函数。 functionUnknown 函数尝试对数组进行排列,类似于 next_permutation

28. 若输入 2024 1 -1,那么程序将不会输出任何数字。( 正确 ) 因为 i <= r 的条件永远不会满足,所以循环不会执行。

29. 若把第14行i的类型改为unsigned int,则程序可能无法结束运行。( 正确 ) 如果 iunsigned int 类型,那么 -1 会变成一个非常大的正整数,导致循环可能无限进行。

30. 对于所有符合要求的输入,输出的数字不可能超过一个。( 错误 ) 由于 f(i)g(i) 是确定性的函数,如果存在多个 i 使得 f(i) == y,那么它们也必须满足 g(i) == y,但由于 fg 是不同的函数,这种情况不太可能发生。

31. 若从所有unsigned int当中随机均匀选取一个x,则f(x)=g(x)成立的概率和( C. (\frac{1}{2}) )的差最小。 这个概率取决于 fg 函数的性质,但通常这种类型的问题需要通过统计或数学分析来确定。

32. 定义 ( f^n(x) ) 表示对 x 用函数 f 作用 n 次的结果,...,则 T(n) 最小是( B. (\Theta(\log{n})) ) 如果存在一种快速幂的算法,那么 ( T(n) ) 应该是 ( \Theta(\log n) )。

33. 当输入为 50 1 4294967295 时,输出的第一个数是( B. 8 ) 这个结果取决于 f(i) 函数和输入的值,需要实际运行程序来确定。

完善程序/3 分

最小垄断集问题

34. ①处应填( B. is[k] == 0 ) 我们需要找到尚未访问的节点,这些节点的 is[k] 应该为0。

35. ②处应填( A. {0, 0, 0} ) cnt 数组用于计数,初始化为0。

36. ③处应填( C. !is[q.front()] ) 我们需要为队列中的每个节点标记一个值,这个值应该是它之前未标记的值的反面。

37. ④处应填( B. is[to] != is[q.front()] ) 我们需要检查 to 节点是否已经被标记了,并且它的标记值是否与队列前端节点的标记值不同,这样才能保证垄断集的条件。

38. ⑤处应填( B. min(cnt[0], cnt[1]) ) 垄断集中至少需要包含一个节点,所以我们选择 cnt[0]cnt[1] 中较小的一个。

最长公共前缀问题

39. ①处可以填( C. s[a[i]][p] ? s[a[i]][p] - 'a': 0 ) 我们需要获取当前节点 a[i] 在字符串 s 中第 p 个字符的 ASCII 码值减去 'a' 的值,如果 p 超出了字符串长度,则为0。

40. ②处应填( A. tmp[ch][tail[ch]++] = a[i] ) tmp 数组用于存储每个字符下的所有索引,ch 是当前字符的ASCII码值减去'a',tail[ch] 表示当前字符索引数组的长度。

41. ③处应填( A. ans = (ans + 1ll (p - 1) tail[j] % mod) % mod ) 这里计算的是当前字符之前所有字符的公共前缀长度乘以该字符出现的次数,然后对 mod 取模。

42. ④处应填( A. ans = (ans + dfs(pos + 1, pos + tail[i], p + 1)) % mod ) 递归调用 dfs 函数,处理当前字符之后的字符串。

43. ⑤处应填( A. dfs(0, n - 1, 0) ) 从索引0开始到n-1结束,p 从0开始,表示我们从字符串的第0个字符开始计算LCP。