Submission #97740

#TimeUsernameProblemLanguageResultExecution timeMemory
97740AnaiTents (JOI18_tents)C++14
100 / 100
178 ms71288 KiB
#include <bits/stdc++.h>
using namespace std;

template<long long MOD>
class Num {
private:
	long long expow(long long base, long long e) const {
		long long ans = 1;
		for (; e > 0; e/= 2) {
			if (e % 2)
				ans = ans * base % MOD;
			base = base * base % MOD; }
		return ans; }

public:
	long long val;

	Num(long long _val) {
		val = _val % MOD;
		val = val < 0 ? val + MOD : val; }
	Num() : val(0) { }

	inline Num operator + (const Num &arg) const {
		Num res;
		res.val = val + arg.val;
		res.val = res.val >= MOD ? res.val - MOD : res.val;
		return res; }

	inline Num operator - (const Num &arg) const {
		Num res;
		res.val = val - arg.val;
		res.val = res.val < 0 ? res.val + MOD : res.val;
		return res; }

	inline Num operator - () const {
		Num res;
		res.val = MOD - res.val;
		res.val = res.val == MOD ? 0 : res.val;
		return res; }

	inline Num operator ^ (const int &arg) const {
		return Num(expow(val, arg)); }

	inline Num operator * (const Num &arg) const {
		return Num(val * arg.val); }

	inline Num operator / (const Num &arg) const {
		return Num(val * expow(arg.val, MOD - 2)); }

	inline void operator += (const Num &arg) {
		(*this) = (*this) + arg; }

	inline void operator -= (const Num &arg) {
		(*this) = (*this) - arg; }

	inline void operator *= (const Num &arg) {
		(*this) = (*this) * arg; }

	inline void operator /= (const Num &arg) {
		(*this) = (*this) / arg; }

	inline void operator ^= (const long long &arg) {
		val = expow(val, arg); } };

template<long long MOD>
ostream &operator << (ostream &fo, const Num<MOD> &c) {
	fo << c.val;
	return fo; }

template<long long MOD>
istream &operator >> (istream &fi, Num<MOD> &c) {
	fi >> c.val;
	c = Num<MOD>(c.val);
	return fi; }

const int N = 3005, MOD = 1e9 + 7;


Num<MOD> dp[N][N];
int n, m;

int main() {
#ifdef HOME
	freopen("joi_tents.in", "r", stdin);
	freopen("joi_tents.out", "w", stdout);
#endif
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);
	Num<MOD> ant;

	cin >> n >> m;

	for (int i = 0; i < N; ++i)
		dp[0][i] = dp[i][0] = 1;

	for (int i = 1; i <= n; ++i)
	for (int j = 1; j <= m; ++j) {
		dp[i][j]+= dp[i - 1][j];
		if (j >= 2)
			dp[i][j]+= dp[i - 1][j - 2] * (j * (j - 1) / 2);
		if (i >= 2)
			dp[i][j]+= dp[i - 2][j - 1] * (i - 1) * j;
		dp[i][j]+= dp[i - 1][j - 1] * j * 4; }


	cout << dp[n][m] - 1 << endl;

	return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...