推薦題目(我不會做,如果有人明白了一定要告訴我,萬分感謝)
阿新 • • 發佈:2018-08-29
如果 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; }
推薦題目(我不會做,如果有人明白了一定要告訴我,萬分感謝)