『题解』Luogu P8152 「PMOI-5」破译の论
题目大意
有一个正方形,要进行 \(k\) 次分割,每次分割需要把位于当前图形右下角的矩形继续分割,每次分割需要把图形分割成 \(n \times n\) 个正方形。输出进行 \(k\) 次分割后,一共有多少个矩形。
样例解释:
输入:2 2
。
输出:7
。
进行 \(2\) 次分割,每次将右下角矩形分割为 \(2 \times 2\) 的矩形。
第一次分割,由于只有一个矩形,所以右下角矩形即为此矩形。分割前后如下:
变为
接下来进行第二次分割,将右下角矩形进行分割,分割为如下图形:
此图形包含 \(7\) 个矩形,因此答案为 \(7\)。
(样例解释直接从题面上搬下来的)
思路
看到那 \(10^9\) 的数据范围,就知道了这题要 \(\mathcal{O}(1)\) 求出答案。
以样例为例,很容易发现,下图中蓝色,绿色部分分别为每次分割时一定会多分出来的矩阵,每次分割出来的都是 \(n \times n-1\) 个。
发现了这个,这题就变得水的不能再水了。
一共要分割 \(k\) 次,那么除去图中白色部分,剩余的矩阵就是 \((n \times n-1) \times k\) 个,最后一次分割会多出一个类似图中白色部分的矩阵,再将它加上,就得到了最终答案。
感谢 PMOI,让我白嫖了这么多估值()
还有一个,就是注意实时取模 \(998244353\),这个数读起来好顺口。
代码
#include <iostream>
using namespace std;
typedef long long ll; // 要开 long long
const int mod=998244353;
ll n,k,ans;
int main(){
cin >> n >> k;
cout << (((((n*n)%mod)-1)*k)%mod+1)%mod << endl; // 注意实时取模
return 0;
}