SFOI Round 1
和锣鼓专栏同步一下。
A
小 F 是我。
排序贪心。
将方格纸化为一个一维数组求解,因为是求消除的「影子」的层数的总和的最大值 (我在说什么),于是对其进行排列,循环计算最大的几项的总和,当 \(t=0\) 时就输出结果。
对于这个「妙意」,另外定义一个变量来计算可以增加的量即可,具体见代码。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e8 + 9;
int n, m, k, t, a[N], ans = 0, p = 0;
//ans 用来求总和,p 用来求增加的「妙意」
signed main() {
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
cin >> n >> m >> k >> t;
for (int i = 0; i < n * m; ++i) cin >> a[i];//共有 (n * m) 个元素
sort(a, a + n * m);
for (int i = m * n - 1; ~i; --i) {//大的元素在后,所以从后方开始计算,或者可以写个 cmp 函数再排序,从前往后计算
if (!t) {
cout << ans;
return 0;
}
ans += a[i];
p += a[i];
--t;
t += p / k;//计算可以增加的「妙意」的总和
p %= k;//计算剩余
}
cout << ans;
return 0;
}
B
首先考虑字符串的数量,因为每个位置都有 \(26\) 个可能的字母,那么数量为 \(26^n\)。
然后,我们需要排除那些不包含 \(\texttt a\) 或 \(\texttt b\) 的字符串。在不包含 \(\texttt a\) 的字符串中,每个位置都有 \(25\) 个可能的字母,即 \(25^n\) 个。同理,不包含 \(\texttt b\) 的字符串也有 \(25^n\) 个。
但刚才排除了两次那些既不包含 \(\texttt a\) 也不包含 \(\texttt b\) 的字符串。因此,我们需要加上这部分的数量。因为每个位置上,除了 \(\texttt a\) 和 \(\texttt b\) 以外都有 \(24\) 个可能的字母,那么这些字符串的数量为 \(24^n\)。
所以,满足条件的字符串的数量是:
用快速幂。
由于 C++ 的特性,我们需要对答案加上模数的倍数(不为 \(1\) 倍)再进行取模,否则答案可能为负数。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mod = 998244353;
int fpm(int a, int b, int m) {
a %= m;
int x = 1;
while (b > 0) {
if (b & 1) x = x * a % m;
a = a * a % m;
b >>= 1;
}
return x;
}
int t, n;
signed main() {
cin >> t;
while (t--) {
cin >> n;
cout << (fpm(26, n, mod) - 2 * fpm(25, n, mod) + fpm(24, n, mod) + mod * 10) % mod << '\n';
}
return 0;
}
C
思路
既然 \(n,m \in [1,10^{18}]\),而且这题还是博弈论,那么可以猜测这题正解是 \(O(1)\) 推结论。
对于博弈论的题,通常都是打表找规律,那么对于此题,我们也可以打一些范围比较小的表来得到结论。
设 \(n=m=1\),这组数据有样例解释,先手动不了,所以无解。
设 \(n=m=2\),可以发现先手只要进行操作三即可获得胜利。
设 \(n=1,m=2\),此时先手向上移动一格即可获得胜利。
设 \(n=2,m=1\),此时先手向右移动一格即可获得胜利。
设 \(n=m=3\),此时操作三对先手不利,所以先手肯定是要向右或向上移动,对于后手,此时进行操作三是最优策略,移动后先手只能移动到 \((3,3)\),先手失败。
设 \(n=m=4\),进行操作三移动到 \((2,2)\),此时的情况对于后手相当于是 \(n=m=3\) 时的情况,这种情况在上文已经推导过了,所以后手必输,即 \(n=m=4\) 时,先手进行操作三必胜。
设 \(n=3,m=4\),容易发现向上移动则先手必胜。
设 \(n=4,m=3\),此时相当于把上一种情况转了一下,先手向右移动可以必胜。
通过以上的打表,可以推测出结论:
-
结论一:当 \(n\) 和 \(m\) 都为奇数时,无解,输出 \(-1\)。
-
结论二:当 \(n\) 和 \(m\) 都为偶数时,输出 \(3\)。
-
结论三:当 \(n\) 为奇数,\(m\) 为偶数时,输出 \(1\)。
-
结论四:当 \(n\) 为偶数,\(m\) 为奇数时,输出 \(2\)。
证明
结论一证明:
我们可以从 \((1,1)\) 开始将棋盘划为若干个 \(2\times 2\) 的小棋盘(\(n,m\ne 1\),所有的小棋盘不重叠),设此时的小棋盘组成棋盘 1,此时 \((n,m)\) 不会在棋盘 1 内。同理,从 \((2,2)\) 开始再次划分不重叠的小棋盘,组成棋盘 2,\((1,1)\) 不在棋盘 2 内。对于先手,从棋盘 1 的方面考虑,后手反之。记棋盘 1 中的点 \((x,y)\) 为 \((x,y)_1\),棋盘 2 同理。
先手操作时,在 \(2\times 2\) 的小棋盘内,走到 \((2,2)_1\) 明显是最优策略。后手操作,此时 \((2,2)_1\) 相当于 \((1,1)_2\),那么对于后手走到 \((2,2)_2\) 为最优策略(如果走到了最右端则向上,走到最上端则向右),如此循环,先手最终会走到 \((n-1,m-1)\) 或 \((n-1,m)\) 或 \((n,m-1)\),此时后手再移动一步即可胜利,则当 \(n\) 和 \(m\) 都为奇数时,先手必输。
结论二证明:
同样还是划分棋盘,容易发现进行操作三对于双方都是最优策略,双方循环操作三(如果走到了最右端则向上,走到最上端则向右),后手最终会走到 \((n-1,m-1)\) 或 \((n-1,m)\) 或 \((n,m-1)\),此时先手再移动一步即可胜利,所以当 \(n\) 和 \(m\) 都为偶数时,第一步执行操作三必胜。
结论三证明:
划分棋盘,先手向右移动一格,对于后手,此时的棋盘的大小是奇数乘奇数,通过结论一可以得知后手必输,所以当 \(n\) 为奇数,\(m\) 为偶数时,第一步执行操作一必胜。
结论四证明:
由于这种情况相当于是把结论三的情况转了个方向,所以在证结论三的同时已经证了结论四,那么容易得出结论,所以当 \(n\) 为偶数,\(m\) 为奇数时,第一步执行操作二必胜。
时间复杂度 \(O(T)\)。
#include <bits/stdc++.h>
using namespace std;
long long n, m, t;
int main() {
cin >> t;
while (t--) {
cin >> n >> m;
if ((n & 1) && (m & 1)) cout << -1 << '\n';
else if (!(n & 1) && !(m & 1)) cout << 3 << '\n';
else if ((n & 1) && !(m & 1)) cout << 1 << '\n';
else cout << 2 << '\n';
}
return 0;
}
D
不会。
Ex
小 F 记性不好。
#-1
另外特别感谢 Knight_skywalker 老师的友情出演!
他的 UID 和比赛编号相同。
你们不觉得挂个不可见的人在这很奇怪吗。
#0
\(\text{Ex}\) 题的题目信息是四个问号,但你把鼠标放上去就会发现:这玩意是能点的!点进去会跳转到洛谷用户的用户界面,但原本是 UID 的位置改成了一个字符,这些字符都对应邀请码的四个字符,拼起来就是邀请码。
#1
第三行旁边藏了白色链接。
#2
先把每个人及其对应的话按照人名的字典序排序,然后将各个单词的第一个字符拼起来得到 bHF0NTIw,看这玩意多像 base64 码啊,解码就行,解码的网站百度一下就有。
#3
玩源玩的。
最后那句话已经提示你是头图标题藏东西了,对标题取色可以发现标题的色号是 (31,30,51),这玩意转化为十六进制是 #1f1e33,而 #1f1e33 是一首被音游 Arcaea 收录的曲子,而这题答案是七个字符,于是可以猜到这个色号就是本题的答案。
还没完,既然是 Round 10,可以猜到是要把 \(\text{1F1E33}\) 转为十进制,即为 \(2039347\)。
如果你查看了题面的 Markdown,会发现这题的 \(7\) 的颜色是 #1f1e33。
#4
回到比赛页面观察头图,发现最上方有一条小 F 的消息:
我是白毛可爱小萝莉!()
#5
「字典」和「只要勇士们团结起来」是在提示把五个人的字母按照字典序排序。
#6
不觉得抽奖代码写那么长一坨很奇怪吗?
这个函数是抽奖代码中的 randchg() 函数。
#7
T1 题面:

#8
这个提示的意思是:“Taiko 2021.04.01”指的是音游太鼓达人在 2021 年 4 月 1 日更新的一首愚人节曲《彁》,这首歌的 BGA 中包含了大量抽象元素,本题的部分内容就包含它们,比如乱码、看不懂的字体和半个二维码等。
Ex 题面处问题
这串码是 Unicode(你也可以理解为 ASCII 码),把里面的数字以 char 形式输出,得到云剪贴板 URL。
或者复制下来扔到云剪贴板里,会输出对应字符。
剪贴板 1(pe1sj8kq)
这个是 BV 号,在噼里啪啦打开视频翻到评论区的置顶评论,底下有一条回复,那条回复就是下一个剪贴板的 URL。
剪贴板 2(nnxmgwao)
京中有善口技者。
这是 UTF-8 转 shift-jis 的乱码,可以使用以下 Python 代码转化:
print(''.encode('shift-jis').decode('utf-8',errors='replace'))
# 两个单引号之间填你要转化的内容
将八条乱码转化,可以得到:
�?ち�?ゼロ�?ゼロ�?ゼロ�?ゼロ
ゼロ�?�?ち�?�?ち
ゼロ�?�?ち�?�?ち
ゼロ�?ゼロ�?�?ち�?ゼロ
�?ち�?ゼロ�?ゼロ
�?ち�?�?ち�?�?ち
�?ち�?�?ち�?ゼロ�?ゼロ
ゼロ
其中反复出现了 “ち” 和 “ゼロ”(0 的意思),可以想到这玩意是摩斯密码,“ち”为线,“ゼロ”为点,然后将摩斯密码转化,得到剪贴板 URL。
闲话:“ち”原本是 “いち”(1 的意思),但“い”似乎没法转化,于是就只有了个 “ち”。
剪贴板 3(6wwfdoze)
找不寻常的字母或数字。
剪贴板 4(tg8ux9fc)
这个是 Electroharmonix 字体,为下一个剪贴板的 URL。
剪贴板 5(qxupp8hl)
这个是 Runes 字体,为下一个剪贴板的 URL。
剪贴板 6(kd1iprah)
\(\color{1f1e33}\Huge{ここには何もない}\tiny{のが……?}\)
你猜我为啥不用洛谷图床?
左下角藏了半个二维码。剪贴板 4 中的右下角也藏了半个二维码,拼起来扫描得到一串 url,这玩意是洛谷图床的 url(谁告诉你这种 8 位的 url 一定是剪贴板的?),图片里是下一个剪贴板的 url。
剪贴板 7(kmd25yp5)
done.
#9
Ex 最正经的一题。
问题 1
若 \(x\le a\),则
若 \(x>a\),则
所以不等式的解集为 \((\dfrac a3,3a)\)。
问题 2
设 \(f(x)\) 与 \(y\) 轴交于 \(D\),与 \(x\) 轴交于 \(A\) 与 \(B\) (\(A\) 在 \(B\) 的左边),设有一点 \(C\) 在 \(f(x)\) 上,\(x_C=a\)。
则有 \(A(\dfrac a2,0),B(\dfrac {3a}2),C(a,-a),D(0,a)\)。\(f(x)\) 与坐标轴围成的面积即为 \(S_{\triangle OAD}+S_{\triangle ABC}\)。
那么
解 \(\dfrac34a^2=2\),得 \(a_1=\dfrac{2\sqrt 6}{3},a_2=-\dfrac{2\sqrt 6}{3}\)(\(a_2<0\),舍去)。
所以答案为 \(\dfrac{2\sqrt 6}{3}\)。
闲话:这题是 2023 年高考甲卷数学的倒一,所以你可以在网上搜到答案。
#include <bits/stdc++.h>
using namespace std;
string ans[] = {
"9ybkarrl",//#1
"lqt520",//#2
"2039347",//#3
"白毛可爱小萝莉",//#4
"fhtxz",//#5
"229052162305",//#6
"hoshinogen",//#7
"1127321",//#8
"(a/3,3*a) 2*sqrt(6)/3"//#9
};
int main() {
int n;
cin >> n;
cout << ans[n - 1];
}

浙公网安备 33010602011771号