70分求调
查看原帖
70分求调
1028047
ZinfI_Sh楼主2024/7/24 13:47

rt

#include <bits/stdc++.h>
#define int long long
#define min(x, y) (x < y ? x : y)
#define max(x, y) (x > y ? x : y)
#define lowbit(x) (x & -x)
using namespace std;
const int DM[8][2] = {0, 1, 0, -1, 1, 0, -1, 0, 1, 1, 1, -1, -1, 1, -1, -1};
const int HASHMOD = 9223372036854775783;
const int HASHBASE = 131;
const int HASHITEM = 999997;
const int MOD = 1e8;
inline void read(int &res)
{
    int x = 0, f = 1;
    char ch = getchar();
    while (ch < '0' || ch > '9')
    {
        if (ch == '-')
            f = -1;
        ch = getchar();
    }
    while (ch >= '0' && ch <= '9')
    {
        x = x * 10 + ch - 48;
        ch = getchar();
    }
    res = x * f;
}
struct Node
{
    int bit[20], siz = 0;
} ground[20];
int n, m, a[20][20], dp[20][16384];
void pre(int l, int bit)
{
    int cnt = 0;
    for (int i = 0; i < 1 << m; i++)
    {
        if (i & bit || i & (i << 1) || i & (i >> 1))
        {
            continue;
        }
        // ground[l].siz++;
        // ground[l].bit[ground[l].siz] = i;
        ground[l].bit[++cnt] = i;
    }
    ground[l].siz = cnt;
}
int DamnPee()
{
    for (int i = 1; i <= ground[1].siz; i++)
    {
        dp[1][i] = 1;
    }
    for (int i = 2; i <= n; i++)
    {
        for (int j = 1; j <= ground[i].siz; j++)
        {
            for (int k = 1; k <= ground[i - 1].siz; k++)
            {
                if (ground[i].bit[j] & ground[i - 1].bit[k])
                    continue;
                dp[i][j] += dp[i - 1][k];
                dp[i][j] %= MOD;
            }
        }
    }
    int res = 0;
    for (int i = 1; i <= ground[n].siz; i++)
    {
        res = (res + dp[n][i]) % MOD;
        // cout<<ground[n].bit[i]<<'\n';
    }
    return res % MOD;
}
signed main()
{
    cin >> n >> m;
    for (int i = 1; i <= n; i++)
    {
        int sum = 0;
        for (int j = 1; j <= m; j++)
        {
            cin >> a[i][j];
            sum = (sum << 1) + (!a[i][j]);
        }
        pre(i, sum);
    }
    cout << DamnPee();
    return 0;
}

还有为什么 pre() 中的 ground[l].bit[++cnt]=i 改成 ground[l].bit[++ground[l].siz]=i 并删掉 ground[l].siz=cnt 会多 WAWA 几个点啊

2024/7/24 13:47
加载中...