求条,疑似取模不规范,样例过不了
查看原帖
求条,疑似取模不规范,样例过不了
1038334
wth2026楼主2024/9/4 17:33

RT,

#include <cstring>
#include <iostream>
#include <algorithm>

#define endl '\n'
#define int long long
#define inf 998244353
#define lnf 0x3f3f3f3f3f3f3f3f

#pragma GCC optimize (1)
#pragma GCC optimize (2)
#pragma GCC optimize (3)
#pragma GCC optimize ("Os")
#pragma GCC optimize ("Ofast")

const bool Debug = false;

//#define Debug true

using namespace std;

namespace WTH {
	template <typename _Tp, size_t n, size_t m>
		class Matrix {
			private :
			
			protected :
			
			public :
				_Tp _Mp[n][m];
				
				void Reset () {
					memset (_Mp, 0, sizeof (_Mp));
				}
				
				bool Set () {
					if (n != m) {
						return 0;
					}
					
					Reset ();
					
					for (register int i = 0; i < n; ++ i) {
						_Mp[i][i] = 1;
					}
					
					return 1;
				}
				
				template <size_t M>
					Matrix <_Tp, n, M> operator * (const Matrix <_Tp, m, M> _Oper) {
						Matrix <_Tp, n, M> _Rtrn;
						_Rtrn.Reset ();
						
						for (register int k = 0; k < m; ++ k) {
							for (register int i = 0; i < n; ++ i) {
								for (register int j = 0; j < M; ++ j) {
									_Rtrn._Mp[i][j] += (_Mp[i][k] * _Oper._Mp[k][j]) % inf;
									_Rtrn._Mp[i][j] %= inf;
								}
							}
						}
						
						return _Rtrn;
					}
				
				Matrix <_Tp, n, m> operator ^ (int _Oper) {
					Matrix <_Tp, n, m> _Ans;
					_Ans.Set ();
					
					if (n != m) {
						return _Ans;
					}
					
					while (_Oper) {
						if (_Oper & 1) {
							_Ans = _Ans * (* this);
						}
						
						(* this) = (* this) * (* this);
						_Oper >>= 1;
					}
					
					return (* this);
				}
				
				void operator ^= (int _Oper) {
					(* this) = (* this) ^ _Oper;
				}
				
				void debug () {
					for (register int i = 0; i < n; ++ i) {
						for (register int j = 0; j < m; ++ j) {
							cout << _Mp[i][j] << ' ';
						}
						
						cout << endl;
					}
				}
			
		} ;
	
	const int N = (1 << 6) + 5;
	
	int h, w;
	int h_2, f[N];
	int _Ans, _;
	Matrix <int, N, N> _Cmpt;
	
	void DFS (int id, int lst, int nw) {
		if (! (h - id)) {
			if (! lst) {
				++ f[nw];
			}
			
			return ;
		}
		
		if (! (lst - 1)) {
			DFS (id + 1, 0, ((nw << 1) | 1));
		} else {
			DFS (id + 1, 0, (nw << 1));
			DFS (id + 1, 0, ((nw << 1) | 1));
			DFS (id + 1, 1, ((nw << 1) | 1));
		}
	}
	
	namespace IO {
		void Input () {
			cin >> h >> w;
		}

		void Output () {
			cout << _Ans % inf << endl;
		}
	}

	void Init () {
		_Ans = 0;
	}

	void Main () {
		IO :: Input ();
		
		h_2 = (1 << h);
		DFS (0, 0, 0);
		
		for (register int i = 0; i < h_2; ++ i) {
			_ = i ^ (h_2 - 1);
			
			for (register int j = 0; j < h_2; ++ j) {
				if ((_ & j) == _) {
					_Cmpt._Mp[i][j] = f[i & j];
				}
			}
		}
		
		if (Debug) {
			_Cmpt.debug ();
		}
		
		_Cmpt ^= (w - 2);
		
		if (Debug) {
			_Cmpt.debug ();
		}
		
		for (register int i = 0; i < h_2; ++ i) {
			_Ans = (_Ans + f[i] * _Cmpt._Mp[i][h_2 - 1] % inf) % inf;
		}
		
		IO :: Output ();
	}
}

signed main () {
	ios :: sync_with_stdio (Debug);
	cin.tie (0);
	cout.tie (0);

	int T = 1;
	//cin >> T;

	while (T --) {
		WTH :: Init ();
		WTH :: Main ();
	}

	return 0;
}
2024/9/4 17:33
加载中...