递归46pt求助
查看原帖
递归46pt求助
735666
thinkerliu楼主2023/9/30 23:43

孩子复杂度O(n!)还有救吗。。。

#include <bits/stdc++.h>

int n, mod;
std::vector<std::vector<int>> a;

unsigned long long calc(int n, std::vector<std::vector<int>> v)
{
    if (n == 1)
    {
        return v[1][1];
    }

    if (n == 2)
    {
        return v[1][1] * v[2][2] - v[1][2] * v[2][1];
    }

    unsigned long long ans = 0;

    for (auto i = 1; i <= n; i++)
    {
        std::vector<std::vector<int>> v;
        v.resize(n + 10);
        for (auto j = 1; j <= n; j++)
        {
            v[i].resize(n + 10);
        }

        for (auto j = 1; j <= n; j++)
        {
            for (auto k = 1; k <= n; k++)
            {
                if (j == i || k == i)
                {
                    continue;
                }

                if (j < i && k < i)
                {
                    v[j][k] = a[j][k];
                }
                else if (j < i && k > i)
                {
                    v[j][k] = a[j][k - 1];
                }
                else if (j > i && k < i)
                {
                    v[j][k] = a[j - 1][k];
                }
                else 
                {
                    v[j][k] = a[j - 1][k - 1];
                }
            }
        }

        ans += calc(n - 1, v);
    }

    return ans;
}

int main()
{
    std::cin >> n >> mod;

    a.resize(n + 10);
    for (auto i = 1; i <= n; i++)
    {
        a[i].resize(n + 10);
    }

    for (auto i = 1; i <= n; i++)
    {
        for (auto j = 1; j <= n; j++)
        {
            std::cin >> a[i][j];

            a[i][j] %= mod;
        }
    }

    std::cout << calc(n, a) % mod << std::endl;

    return 0;
}
2023/9/30 23:43
加载中...