推荐题目(我不会做,如果有人明白了一定要告诉我,万分感谢)

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;
}















以上是关于推荐题目(我不会做,如果有人明白了一定要告诉我,万分感谢)的主要内容,如果未能解决你的问题,请参考以下文章

程序员面试时,这8个标准一定要明白!

正常崩溃,但 GDB 不崩溃?

百万数据生成图表会卡?4个软件告诉你,不会!

NOIP2017普及组赛后心得

推荐11款非常实用的CSS3工具,你一定要收藏好

终于有人把如何全面学习C++讲明白了!