补题:K - Magic Tree (Gym - 105231K)
来源:问题 - K - Codeforceshttps://codeforces.com/gym/105231/problem/K
题目描述:
一、题目分析
本题给定一个2行m列的网格,从(1, 1)格子开始进行深度优先搜索,每个格子可到达至少一个边相邻的格子且不重复访问,要求计算所有可能的标记树(用边集E表示 )的数量,并对998244353取模输出。
二、解题思路
找规律:通过对小数据情况(如m = 1, 2, 3等 )进行手动模拟深度优先搜索过程,分析不同m值下标记树的数量。可以发现其数量满足一定的规律,经过归纳推理可得,对于列数为m的网格,标记树的数量为2^{m - 1} 。
快速幂计算:因为m的范围较大,直接计算2^{m - 1}会超时,所以采用快速幂算法来高效计算幂次方。快速幂算法的核心思想是利用二进制的性质,将指数b转化为二进制形式,通过不断平方底数a ,并根据指数二进制位的情况累乘结果,从而计算出a^b 。
三、代码实现(C++)
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mod = 998244353;
// 快速幂函数
int kksuu(int a, int b, int m) {int s = 1;while (b > 0) {if (b % 2 == 1) {s = s * a;s = s % m;}b = b / 2;a = a * a;a = a % m;}return s;
}signed main() {int n;cin >> n;n = n - 1;int t = kksuu(2, n, mod);cout << t << endl;return 0;
}
四、复杂度分析
时间复杂度:快速幂函数 kksuu 的时间复杂度为O(\log n) ,其中n为指数,这里指数最大为10^6 ,相比于直接计算幂次方的O(n)时间复杂度有大幅优化,在本题数据规模下可以高效计算。
空间复杂度:程序中除了输入数据外,使用的额外空间主要是几个变量(如函数中的临时变量 a 、 b 、 s 等 ),空间复杂度为O(1) 。