CF2086D Even String

news/2025/9/21 20:58:31/文章来源:https://www.cnblogs.com/blind5883/p/19104151

题目链接:Problem - D - Codeforces

本身是一道数学题,我们可以把字符串中的奇数项和偶数项分开,形成两条序列 A 和 B。易知一种字母一定在同一条序列上。

假如说在 A 序列上分配了 \(a,b,c\) 三种字母,\(sum = c_a + c_b + c_c\),那么 A 序列的方案数为:

\[ans_A = \frac{sum!}{c_a! \cdot c_b! \cdot c_c!} \]

同理,假如 B 上分配了 \(d,e,f\) 三种字母,\(sum^{\prime} = c_d + c_e + c_f\),那么 B 序列的方案数为:

\[ans_B = \frac{sum!}{c_d! \cdot c_e! \cdot c_f!} \]

那么对于这种分配字母种类的方式,字符串种类一共有 \(ans_A \times ans_B\) 种,即:

\[ans = \frac{sum!\cdot sum!}{c_a! \cdot c_b! \cdot c_c! \cdot c_d! \cdot c_e! \cdot c_f!} \]

可以发现,无论如何分配字母种类,只要分配合法,这一种分配方式的方案数量均为 \(ans\) 不变。而 \(c_i\) 是固定的,因此我们可以直接求出来 \(ans\)。因为有取余下除法,所以需要求逆元。而恰好模数 \(998244353\) 是一个质数,因此可以直接用费马小定理求出。这就是一个数学问题。

处理完 \(ans\),那么问题就剩下这个——求出序列 A,B 的分配字母种类的方案数。因为字母种类有 \(26\) 种,且多测数量达到了 \(10^4\),直接使用 dfs 需要算约 \(10^{12}\) 次,会 TLE,但如果这个 \(26\) 变为 \(13\),那么计算次数就约为 \(10^8\) 可以接受,因此使用双向 dfs 统计可行数量即可。

而在双向 dfs 拼凑答案时为了效率,我们需要使用 unordered_map 去存储每一种 A,B 序列分配字母种类的方案数,这时候会涉及到二维 unordered_map,此时直接用进制转化为一维即可(记得开 longlong)。算出种类数 \(cnt\),那么最后我们的答案就是 \(cnt * ans\),最后取模即可。

最后,还有一点,这题有一个卡常,即在算 \(ans\) 时,你的阶乘不能预处理,这题很极限,100ms 的预处理会正好卡死这题(至少我是这样)。因此需要在线计算阶乘。

AC代码为:

#include <iostream>
#include <cstring>
#include <algorithm>
#include <map>
#include <unordered_map>using namespace std;typedef long long LL;
typedef pair<int, int> PII;
// typedef unordered_map<int, int> UII;const int mod = 998244353, N = 500010;int n = 26, m;
int ans, sum, tx, ty;
int g[30], cnt;
int f[N], in_f[N];
unordered_map<LL, int> q; int qmi(int a, int k, int q)
{int res = 1;while (k){if (k & 1) res = 1ll * res * a % mod;k >>= 1;a = 1ll * a * a % mod;}return res;
}int fd(int x)
{int res = 1;for (int i = 1; i <= x; i ++ ) res = 1ll * i * res % mod;return res;
}int in_fd(int x)
{int res = 1;for (int i = 1; i <= x; i ++ ) res = 1ll * i * res % mod;return qmi(res, mod - 2, mod);
}void dfs(int x, int s1, int s2)
{if (x > m) {q[s1 * N + s2] ++ ;return ;}if (g[x] == 0) dfs(x + 1, s1, s2);else {if (s1 + g[x] <= tx) dfs(x + 1, s1 + g[x], s2);if (s2 + g[x] <= ty) dfs(x + 1, s1, s2 + g[x]);}
}void dfs2(int x, int s1, int s2)
{if (x > n) {cnt += q[(tx - s1) * N + (ty - s2)];return ;}if (g[x] == 0) dfs2(x + 1, s1, s2);else {if (s1 + g[x] <= tx) dfs2(x + 1, s1 + g[x], s2);if (s2 + g[x] <= ty) dfs2(x + 1, s1, s2 + g[x]);}
}int main()
{int T;cin >> T;while (T -- ){q.clear();ans = 1, cnt = sum = 0;for (int i = 1; i <= n; i ++ ) scanf("%d", &g[i]), sum += g[i];sort(g + 1, g + 1 + n);reverse(g + 1, g + 1 + n);tx = sum / 2, ty = (sum + 1) / 2;m = 13;dfs(1, 0, 0);dfs2(m + 1, 0, 0);for (int i = 1; i <= n; i ++ ) ans = 1ll * ans * in_fd(g[i]) % mod;cout << 1ll * cnt * fd(tx) % mod * fd(ty) % mod * ans % mod << '\n';} return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/909037.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

logicflow___文档3

# LogicFlow 流程图编辑器开发文档## 📖 概述这是一个基于 LogicFlow 的流程图编辑器完整开发指南,包含详细的代码示例和实现方案。该编辑器支持节点创建、连接线绘制、关系管理等功能。## 🚀 快速开始### 1. 安装…

langraph-up-react

langraph-up-react https://github.com/fanqingsong/langraph-up-reactLangGraph ReAct Agent TemplateThis template showcases a ReAct agent implemented using LangGraph, works seamlessly with LangGraph Studio…

2025年运营商API安全建设最佳实践:某头部省级电信案例解析与方案推荐

2025年运营商API安全建设最佳实践:某头部省级电信案例解析与方案推荐运营商API安全需应对资产可视性缺失、动态风险防护不足、合规压力三大挑战。全知科技(Data-Sec)知影-API风险监测系统通过“规则引擎+AI引擎”双轮…

软件工程第二次作业-第一次个人编程作业

个人编程作业项目 内容这个作业属于哪个课程 [软件工程](首页 - 计科23级12班 - 广东工业大学 - 班级博客 - 博客园)这个作业要求在哪里 [作业要求](个人项目 - 作业 - 计科23级12班 - 班级博客 - 博客园)这个作业的目…

面向对象入门2与类的识别

一、什么样的方法应该用static修饰?不用static修饰的方法往往具有什么特性?Student的getName应该用static修饰吗?static 修饰方法的适用场景应该用 static 修饰的方法:方法与对象的状态无关,只依赖传入的参数完成…

202508_天山固网_to

流量分析,dvorak键盘解码, 大小写转二进制, BIN2QRCODETags:流量分析,dvorak键盘解码,大小写转二进制,BIN2QRCODE 0x00. 题目 【天山固网——2025网络安全技能竞赛】 children of stream 附件路径:https://pan.baid…

Java学生信息管理系统代码分析

Java学生信息管理系统代码分析学生信息管理系统代码分析 功能讲解 数据处理 该程序主要处理学生信息数据,包括学生的姓名、年龄、性别、学号、专业和 GPA 等信息。这些数据通过Student类的对象进行封装,并存储在Stud…

ArcGIS Pro中 Nodata和nan 黑边的处理 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

怎么屏蔽 ahref.com 上你不想看到的网站链接(垃圾外链)

怎么屏蔽 ahref.com 上你不想看到的网站链接(垃圾外链)在 ahref 网站查看自己网站或别人网站的外链时,查询的结果里面总会充斥着各种垃圾网站的链接,你一点击过去就会弹出一个聊天窗口或者是什么广告。 虽然时间久…

浅谈字典树

本篇文章同步发表在洛谷博客。字典树 什么是字典树? 字典树,顾名思义它是一棵类似于字典的树,用树的形态存储字符串集合。具体地,它有一个自定义的无意义的根节点(通常编号为 \(0\) 或 \(1\)),所有存储进去的字…

go-mapus为局域网地图协作而生

很多年前就用mapus了,它是用实时数据库实现协作功能。可是实时数据库是国外的,不好用,速度慢,经常封掉。 这次直接用sqlite,简单快捷,加上websocket即可,没有原来想象的那么玄乎,代码也就几千行。 我把几十G的…

【工具变量】“国家级大数据综合试验区”试点城市DID(2000-2024年) - 教程

【工具变量】“国家级大数据综合试验区”试点城市DID(2000-2024年) - 教程2025-09-21 20:28 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x…

《手搓动态顺序表:从数组到自动扩容的华丽转身》 - 详解

《手搓动态顺序表:从数组到自动扩容的华丽转身》 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas…

板子大全

整理一下常用的板子,并重新复习一下。线段树 维护复杂信息时重载 + 号,不同的修改直接在 upd() 中改。 struct SegTree{ #define ls u<<1 #define rs u<<1|1 #define mid ((l+r)>>1)ll tr[N<&l…

通过人大金仓数据库的逻辑备份与还原功能实现数据迁移

1、源数据库的操作 1.1、逻辑备份如上图所示,在源数据库进行备份。 2、目标数据库的操作 2.1、新建数据库如上图所示,新建一个目标数据库。如上图所示,设置新建数据库的名称(本例为 testDB )。如上图所示,新建目…

完整教程:GS1-128(EAN-128)编码构造方式

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Chapter 7 Color Detection

img = cv2.imread(images/lambo.png)def stackImages(scale, imgArray):rows = len(imgArray)cols = len(imgArray[0])rowsAvailable = isinstance(imgArray[0], list)width = imgArray[0][0].shape[1]height = imgArr…

《原子习惯》-读书笔记7

2025.09.21 Day7 第6章 原动力被高估,环境往往更重要 1、产品或服务越是触手可及,你就越有可能去尝试。人们爱喝百威清啤的原因是每个酒吧里都供应它,而人们爱去星巴克的原因是它到处都有。[插图]我们喜欢一切尽在自…

PyQt数字转大写金额GUI程序开发及财务规范实现

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …