『题解』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;
}
posted @ 2022-02-14 13:04  仙山有茗  阅读(67)  评论(0编辑  收藏  举报