1. 程式人生 > >推薦題目(我不會做,如果有人明白了一定要告訴我,萬分感謝)

推薦題目(我不會做,如果有人明白了一定要告訴我,萬分感謝)

如果 c++ 時間 continue 輸入 ont pac 發現 輸入格式

【題目描述】
穿過了沙漠,小 W 來到了一個神秘的國度,它共有 N 個城市。傳說在它的首
都有一本秘籍,只要得到它就能變成強(毒)者(瘤)。在找到了這個國家的地
圖之後,他發現地圖經過長時間的磨損已經看不清了,他只能知道每個城市與
幾個城市相鄰,並且在地圖中邊是雙向的。已知這個國家的道路中不存在自環
和重邊,且不需要連通。現在小 W 會告訴你每個城市相鄰的城市個數,你需要
求出共有多少種不同的地圖,對 998244353 取模。
【輸入格式】
從文件 map.in 中讀入數據。
第一行一個整數 N。
第二行 N 個整數。第 i 個數 Di表示與第 i 個城市相鄰的城市個數。
【輸出格式】
輸出到文件 map.out 中。
一行一個整數表示不同的地圖數量對 998244353 取模後的結果。
數據範圍:對於 100%的數據,滿足 N≤2000,Di∈{1,2}
我不會做,也沒有題解,只有標程,如果有人看得懂一定回復我,謝謝

#include<bits/stdc++.h>
#define ll long long
#define maxn 2010
#define mod 998244353
using namespace std;
ll f[maxn][maxn];
int main()
{
    freopen("map.in", "r", stdin);
    freopen("map.out", "w", stdout);
    int n, s1 = 0, s2 = 0;
    scanf("%d", &n);
    for (int i = 1; i <= n; i++)
    {
        int x;
        scanf("%d", &x);
        if (x == 1) s1++;
        else s2++;
    }
    f[0][0] = 1;
    for (int tot = 0; tot <= n; tot++)
        for (int i = tot; i >= 0; i--)
        {
            int j = tot - i;
            if (j < 0) continue;
            if (j == 0 && i) f[i + 1][j] = (f[i + 1][j] + f[i - 1][j] * i % mod) % mod;
            if (i >= 2)
            {
                ll tmp = f[i - 2][j] * ((ll)i * (i - 1) / 2 % mod) % mod;
                f[i][j + 1] = (f[i][j + 1] + tmp) % mod;
            }
            if (j >= 2)
            {
                ll tmp = f[i + 2][j - 2] * ((ll)j * (j - 1) / 2 % mod) % mod;
                f[i][j + 1] = (f[i][j + 1] + tmp) % mod;
            }
            if (i && j)
            {
                ll tmp = f[i][j - 1] * i % mod * j % mod;
                f[i][j + 1] = (f[i][j + 1] + tmp) % mod;
            }
        }
    printf("%lld\n", f[s1][s2]);
    return 0;
}

推薦題目(我不會做,如果有人明白了一定要告訴我,萬分感謝)