二次求助!!!
查看原帖
二次求助!!!
1054952
zzCX_df楼主2024/7/29 09:13
#include <bits/stdc++.h>
#define lowbit(x) (x & (-x))

using namespace std;

const int P = 1e9 + 7;
int x, y, p, ans, pro[1 << 6][1 << 6], check[1 << 6][1 << 6], f[601][1 << 6][1 << 6], g[601][1 << 6][1 << 6];

inline int count(int x) {
	int sum = 0;
	while (x) {
		++sum;
		x -= lowbit(x);
	}
	return sum;
}

inline bool Ch1(int k1, int k2, bool I) {
	int T = (~(((k1 >> 1) & k1) >> 1)), K;
	K = (T & k2);
	if ((k1 >> 2) & K) 
    return 0;
	T = (~(((k1 << 1) & k1) << 1)) ;
	K = (T & k2);
	if ((k1 << 2) & K) 
    return 0;
	if (I) 
    return 1;
	else 
		return 1 & Ch1(k2, k1, 1);
}

inline bool Ch2(int k1, int k2, int k3, bool I) {
	int T = (~((k1 & k2) >> 1)), K;
	K = (T & k3);
	if ((k1 >> 1) & K) 
    return 0;
	T = (~((k1 & k2) << 1));
	K = (T & k3);
	if ((k1 << 1) & K) 
    return 0;
	if (I) 
    return 1;
	else 
		return 1 & Ch2(k3, k2, k1, 1);
}

int main() {
	scanf("%d%d", &x, &y);
	p = x * y;
	for (int i = 0; i < 1 << y; i++)
    for (int j = 0; j < 1 << y; j++)
      g[count(i) + count(j)][i][j] = 1;

	for (int i = 2; i <= x; i++) {
		for (int j = 0; j < 1 << y; j++)
			for (int k = 0; k < 1 << y; k++)
        if(!(((j & (~(j >> 1))) & (k >> 2)) || ((j & (~(j << 1))) & (k << 2)) || (((k & (~(k >> 1))) & (j >> 2)))||((k & (~(k << 1))) & (j << 2)))) 
				  for (int l = 0; l < 1 << y; l++)
					 if (!(((j & (~k)) & (l >> 1)) || ((j & (~k)) & (l << 1)) || ((l & (~k)) & (j >> 1)) || ((l & (~k)) & (j << 1))))
						  for (int u = count(j); u <= p; u++)
							 f[u][j][k] = (f[u][j][k] % P + g[u - count(j)][k][l] % P) % P;
		memcpy(f, g, p);
		memset(f, 0, sizeof(f));
    for (int i = 0; i < 1 << y; i++)
      for(int j = 0; j < 1 << y; j++)
        for(int k = count(i) + count(j); k <= p; k++)
          ans = (ans + max(g[k][i][j], f[k][i][j])) % P;
	}
  printf("%d\n", ans);
	return 0;
}

2024/7/29 09:13
加载中...