abc321记录
SuntoryProgrammingContest2023(AtCoder Beginner Contest 321) - AtCoder
D
题意:给定常数
数据范围:
tag : 二分 前缀和
枚举
E
题意:多个询问,每个询问给定
数据范围:
tag : 完全二叉树 树形dp
考虑类似换根dp的过程,设
F
题意:
数据范围:
tag : 背包 线段树分治
回退背包板子,注意加入顺序从大到小,回退顺序从小到大。但是赛时线段树分治直接艹过去了
G
题意:给定长度为
数据范围:
tag : 状压dp,容斥
赛后补题,参考了一定的lg题解。
显然总的连边方案数是确定的
注意到
接下来考虑通过
求完
贴个代码
#include <bits/stdc++.h>
#define pb push_back
#define rg register
#define il inline
using namespace std;
typedef long long ll;
//char buf[1<<21],*p1=buf,*p2=buf;
//#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
mt19937_64 rnd(chrono::steady_clock::now().time_since_epoch().count());
const int N = 1<<17, mo = 998244353;
int i, j, k, l, r, m, n, ans;
int a[N], b[N], fc[N], f[N], g[N];
il int read()
{
int x = 0, flag = 1;
char ch = getchar();
while ((ch < '0' || ch > '9') && ch != '-') ch = getchar();
if (ch == '-') flag = -1, ch = getchar();
while (ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar();
return x * flag;
}
int qp(int a, int b=mo-2)
{
int res = 1;
for (a%=mo ; b; b>>=1, a=1ll*a*a%mo) if (b&1) res = 1ll * res * a % mo;
return res;
}
signed main()
{
// ios::sync_with_stdio(false);
// cin.tie(0), cout.tie(0);
n = read(), m = read();
for (fc[0]=i=1; i<=m; i++) fc[i] = 1ll * i * fc[i-1] % mo;
for (i=1; i<=m; i++) a[read()-1]++;
for (i=1; i<=m; i++) b[read()-1]++;
for (k=1; k<(1<<n); k++)
{
int sa = 0, sb = 0, p = -1;
for (i=0; i<n; i++) if (k>>i&1) sa += a[i], sb += b[i], p = ~p ? p : i;
if (sa != sb) continue;
g[k] = f[k] = fc[sa];
for (i=k; i; i=i-1&k) if (i!=k && i>>p&1) g[k] = (g[k] - 1ll * g[i] * f[i^k] % mo + mo) % mo;
ans = (ans + 1ll * g[k] * fc[m-sa] % mo) % mo;
}
printf("%d", 1ll*ans*qp(fc[m])%mo);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话