求调
查看原帖
求调
701221
Chr0n1CleC楼主2022/12/29 18:17
#include<cstdio>

inline int read()
{
	register int ret = 0;
	register bool f = 1;
	register char ch = getchar();
	while (ch < '0' || ch > '9')
		(ch == '-') ? f = 0 : 0, ch = getchar();
	while (ch >= '0' && ch <= '9')
		ret = (ret << 1) + (ret << 3) + (ch ^ 48), ch = getchar();
	return f ? ret : -ret;
}

const int m = read(), n = read(), K = read(), mod = 1e9 + 7;

int sit[(1 << 6) + 9], st[(1 << 6) + 9], cnt;

void dfs(int cur, int sum, int x)
{
	if (sum > K)
		return;
	if (cur >= m)
	{
		sit[++ cnt] = x;
		st[cnt] = sum;
		return;
	}
	dfs(cur + 1, sum, x);
	dfs(cur + 1, sum + 1, x + (1 << cur));
}

int dp[109][(1 << 6) + 9][(1 << 6) + 9][29];

int main()
{
	dfs(0, 0, 0);
	int i, j, k, c, x, ans = 0;
	dp[0][0][0][0] = 1;
	for (i = 1;i <= n;++ i)
	{
		for (j = 0;j <= cnt;++ j)
		{
			for (k = 0;k <= cnt;++ k)
			{
				if (sit[j] & (sit[k] << 2))
					continue;
				if ((sit[j] << 2) & sit[k])
					continue;
				for (c = 0;c <= cnt;++ c)
				{
					if (sit[c] & (sit[j] << 1))
						continue;
					if((sit[c] << 1) & sit[j])
						continue;
					if (sit[k] & (sit[c] << 2))
						continue;
					if ((sit[k] << 2) & sit[c])
						continue;
					for (x = K;x >= st[j];-- x)
						dp[i][j][k][x] = (dp[i][j][k][x] + dp[i - 1][k][c][x - st[j]]) % mod;
				}
			}
		}
	}
	for (i = 0;i <= cnt;++ i)
		for (j = 0;j <= cnt;++ j)
			ans += dp[n][i][j][K], ans %= mod;
	printf("%d", ans);
	
	return 0;
}
2022/12/29 18:17
加载中...