推荐题目(我不会做,如果有人明白了一定要告诉我,万分感谢)
Posted artlover
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了推荐题目(我不会做,如果有人明白了一定要告诉我,万分感谢)相关的知识,希望对你有一定的参考价值。
【题目描述】
穿过了沙漠,小 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
", f[s1][s2]);
return 0;
}
以上是关于推荐题目(我不会做,如果有人明白了一定要告诉我,万分感谢)的主要内容,如果未能解决你的问题,请参考以下文章