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\)

所以,满足条件的字符串的数量是:

\[26^n-2\times 25^n+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-8shift-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 最正经的一题。

\[f(x)=\begin{cases}-2x+a,x\le a\\2x-3a,x>a\end{cases}. \]

问题 1

\(x\le a\),则

\[\begin{aligned}f(x)=-2x+a&<x\\3x&>a\\x&>\dfrac a3\end{aligned} \]

\(x>a\),则

\[\begin{aligned}f(x)=2x-3a&<x\\-3a&<-x\\x&<3a\end{aligned} \]

所以不等式的解集为 \((\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}\)

那么

\[\begin{aligned}S_{\triangle OAD}+S_{\triangle ABC}&=\dfrac12 OA\times a+\dfrac12 AB\times a\\&=\dfrac34a^2\\&=2\end{aligned} \]

\(\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];
}
posted @ 2024-03-31 12:33  FurippuWRY  阅读(86)  评论(0)    收藏  举报