首页 > 其他分享 >题解:P11487 「Cfz Round 5」Gnirts 10

题解:P11487 「Cfz Round 5」Gnirts 10

时间:2024-12-30 10:42:01浏览次数:5  
标签:dots 字符 return 10 int 题解 P11487 ifc mod

枚举 \(S\) 每个前缀,计算其对答案的贡献。

把枚举出来的前缀 \(S[1\dots i]\) 看成已有的串,我们要插入一些字符使得它有 \(n\) 个 \(0\),\(m\) 个 \(1\),且 \(S[1\dots i]\) 为 \(T\) 的子序列,而 \(S[1\dots i + 1]\) 不是。问方案数(统计到最后答案的时候要乘长度)。

发现在 \(1\) 前插 \(0\) 和在 \(0\) 前插 \(1\) 都不会对合法性造成影响。判断 \(S[1\dots i]\) 是否为 \(T\) 的子序列可以看成一个匹配的过程,如果 \(T\) 当前的字符和 \(S\) 当前的字符不同就看 \(T\) 中的下一个字符(称匹配失效),如果相同,就都看下一个字符。\(T\) 中和 \(S\) 当前位不同的都会被略过,其实也就是最初那些“看成已有串”的字符被我们钦定为 \(T\) 中组成 \(S[1\dots i]\) 的字符,其他新插入的都是匹配失效的字符。

按理说我们在最后匹配完成的时候可以肆意放字符,但我们要求 \(S[1\dots i+1]\) 不是 \(T\) 的子序列,所以最后的位置只能放与 \(S_{i+1}\) 不同的字符。

把 \(0\) 和 \(1\) 单独考虑,根据乘法原理,最终方案数为两者方案数相乘。知道放的位置,知道放的个数,最后就是经典的不同小盒放同样的球可以为空的问题了。

#include <bits/stdc++.h>

using namespace std;

#define int long long

#define IL inline
IL int _R() { int x; cin >> x; return x; }

const int N = 3e6;
const int maxN = N * 2 + 3;

const int mod = 2933256077;

int n, m;

int fc[maxN], ifc[maxN];
IL int ksm(int a, int b = mod - 2) {
  int res = 1;
  while (b) {
    if (b & 1) res = res * a % mod;
    a = a * a % mod;
    b >>= 1;
  }
  return res;
}

string s;

int ans;

IL int C(int n, int m) {
  if (n < 0 || m < 0 || n < m) return 0;
  return fc[n] * ifc[m] % mod * ifc[n - m] % mod;
}
IL int F(int n, int m) { // n 个小球放 m 个盒中
  if (!n) return 1; // 注意放 0 个球到任意盒中也可以看做一个方案。
  return C(n + m - 1, m - 1);
}

signed main() {
  n = _R(), m = _R();

  fc[0] = 1;
  for (int i = 1; i <= n + m; i++)
    fc[i] = fc[i - 1] * i % mod;
  ifc[n + m] = ksm(fc[n + m]);
  for (int i = n + m - 1; i >= 0; i--)
    ifc[i] = ifc[i + 1] * (i + 1) % mod;

  cin >> s;
  s = '@' + s + '$';
  int c0 = 0, c1 = 0;
  for (int i = 1; i <= n + m; i++) {
    c0 += s[i] == '0', c1 += s[i] == '1';
    
    auto r1 = F(m - c0, c1 + (s[i + 1] == '0' ? 0 : 1));
    auto r2 = F(n - c1, c0 + (s[i + 1] == '1' ? 0 : 1));

    // cerr << r1 << ' ' << r2 << '\n';

    ans += i * r1 % mod * r2 % mod, ans %= mod;
  }

  cout << ans << '\n';
}

标签:dots,字符,return,10,int,题解,P11487,ifc,mod
From: https://www.cnblogs.com/ccxswl/p/18640325

相关文章

  • 2024年10大顶级项目管理工具
    在当今快节奏的商业环境中,高效的项目管理对于企业的成功至关重要。无论是产品研发、市场营销还是企业运营,都离不开有效的项目管理工具。随着技术的不断发展,2024年涌现出了许多优秀的项目管理工具,它们各具特色,能够满足不同团队和项目的需求。本文将为您介绍2024年的10大顶级项目管......
  • 自学网络安全(黑客技术)2024年 —100天学习计划
    ......
  • 自学网络安全(黑客技术)2024年 —100天学习计划
    ......
  • java.sql.SQLException: CLI-specific condition, message from server: "Host '10.1
    您遇到的错误信息表明,MySQL服务器由于检测到来自主机'10.11.xxx.xx'的多次连接错误而自动封锁了该主机的连接请求。这是一种数据库安全机制,旨在防止潜在的恶意攻击或配置不当导致的资源滥用。要解决这个问题,您可以采取以下步骤:检查网络连接:确保客户端和服务器之间的网络稳定,并......
  • 10款最佳项目管理工具推荐
    在当今数字化时代,项目管理工具的种类繁多,涵盖了从传统的项目管理软件到新兴的云端协作平台等不同类型。这些工具旨在帮助团队更高效地完成项目任务、提升沟通协作能力以及实现项目目标。我们将为大家介绍10款优秀的项目管理工具,这些工具在功能、适用场景等方面各有特点,能够满足不......
  • 使用js写一个方法随机从1–100之间取8个数字并排序
    你可以使用JavaScript的Array,Math.random()和sort()方法来实现这个功能。以下是一个简单的实现:functiongetRandomNumbersAndSort(){//创建一个空数组letarr=[];//使用while循环来确保数组中有8个唯一的数字while(arr.length<8){//生成......
  • 攻克LeetCode 1055:探寻形成字符串的最短路径
    一、题目引入在LeetCode的题库中,1055.形成字符串的最短路径这道题饶有趣味且充满挑战。简单来说,对于给定的源字符串source和目标字符串target,我们要找出源字符串中能通过串联形成目标字符串的子序列的最小数量。如果无法通过串联源字符串中的子序列来构造目标字符串,那就得......
  • P6272 [湖北省队互测2014] 没有人的算术 题解
    本文参考了湖北省队互测Week1解题报告,在部分之处说明可能不如原题解,如有错误请指出。洛谷上的题面缺失了特殊性质,不过原题的特殊性质还是比较具有启发性的,下面是原题面中的数据范围测试点\(1\)考察选手的读题能力。按照题目提供的比较方式暴力递归即可。测试点\(2\sim......
  • 第10章 LINQ to XML
    第10章LINQtoXML10.1架构概述——DOM和LINQtoXML的DOMXML文档可以用一棵对象树完整的表示,这称为“文档对象模型(documentobjectmodel)”LINQtoXML由两部分组成:XMLDOM,简称为X-DOM大约10个查询运算符LINQ也可以用于查询W3C标准的旧DOM,不过X-DOM对L......
  • Spring Boot引起的“堆外内存泄漏”排查及经验总结10
    背景为了更好地实现对项目的管理,我们将组内一个项目迁移到MDP框架(基于SpringBoot),随后我们就发现系统会频繁报出Swap区域使用量过高的异常。笔者被叫去帮忙查看原因,发现配置了4G堆内内存,但是实际使用的物理内存竟然高达7G,确实不正常。JVM参数配置是“-XX:MetaspaceSize=256M-......