【AtCoder - agc040_c】Neither AB nor BA 想法+组合数学

本文详细解析了AtCoder-agc040_c题目,通过巧妙的字符串转换方法,将原问题转化为计数问题。利用组合数学原理,计算出满足特定条件的字符串数量,并给出具体实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【AtCoder - agc040_c】Neither AB nor BA 想法+组合数学

题意

求长度为n(n为偶数)的满足以下条件的字符串数量。

  • 字符串中只含有ABC三种字母,且字符串的长度为偶数。

  • 字符串可以按照以下规则删除成空串

    • 相邻两个字母只要不是AB或者BA都可以删除

题解

因为容易发现奇数位上的A偶数位上的B不能消去,奇数位上的B偶数位上的A也是同理

因此做一个巧妙的转化,把所有奇数位上的A换成B,所有奇数位上的B换成A

例如,ABCBBABBAC转化BBCBAAABBC

这样转换之后就会发现,原来的规则是AB和BA不能消除,现在变成了AA不能消除,BB不能消除

这样就容易发现,想要消除一个A必须跟一个B或者一个C一起消除,B也是同理。

那么在这样的情况下:

  • 如果A的数量超过字符串长度的一半,那么势必无法全部消除

  • 如果B的数量超过字符串长度的一半,那么势必也无法全部消除

那么要求能全部删除的数量,只需要用总数 - 不能完全删除的数量即可得答案

不能完全删除的数量可以这样计算,根据上面的条件可知,只要让A或者B的数量大于字符串长度的一半即可

一个小Tip:可能有同学会觉得,A的数量大于一半就不能消除不是经过转化之后得出的结论吗?那我们要算不能完全删除的数量不是应该转化回去计算吗?(对!没错这个“有同学”就是我)

其实细品一下会发现,就按照转化之后的结论计算完全没问题,因为要构造不合法的情况,你就按照我们的结论,放上大于n/2个A,然后再把奇数位上的A和B按照之前转化过来的规则转化回去,就是本题真正要求的不合法的情况。正因为我们转化前后两种情况是等价的,所以构造出来的不合法的情况,经过转化之后也是等价的。

又因为转化回去构造的话考虑起来蛮复杂的,什么奇A偶B,奇B偶A,所以不如就在转化之后这里计算不合法的数量方便,所以干脆就直接按照转化之后的结论构造即可得出答案(因为我们清楚这两者是等价的啦)

那么只需要处理出A不合法的情况数,再 * 2就是A和B总共的不合法情况数量。

也就是枚举A的数量t从n/2+1到n,给A从n个位置中挑出t个位置

剩下的位置,每个位置都有两种选择B或者C,那么A不合法的情况数就是 C ( n , t ) ∗ 2 n − t C(n,t)*2^{n-t} C(n,t)2nt

长度为n的字符串,每个位置有ABC三种选择,因此字符串总数为 3 n 3^n 3n

长度为n的合法的字符串数量 = 字符串总数 - 不合法字符串数量 = 3 n − 2 ∗ C ( n , t ) ∗ 2 n − t 3^n-2*C(n,t)*2^{n-t} 3n2C(n,t)2nt

/****************************
* Author : W.A.R            *
* Date : 2020-10-08-20:19   *
****************************/
/*
https://vjudge.net/problem/AtCoder-agc040_c
*/
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<stack>
#include<string>
#include<set>
#define IOS ios::sync_with_stdio(false)
#define show(x) std:: cerr << #x << " = " << x << std::endl;
#define mem(a,x) memset(a,x,sizeof(a))
#define Rint register int
using namespace std;
typedef long long ll;
const int maxn=1e7+10;
const int maxm=2e6+10;
const ll mod=998244353;

ll fac[maxn],invFac[maxn],mi[maxn],n,sum;
ll qpow(ll a,ll n){
	a%=mod;
	ll ans=1;
	while(n){
		if(n%2)ans=ans*a%mod;
		n/=2;
		a=a*a%mod;
	}
	return ans;
}
ll C(ll n,ll m){
	if(m>n||m<0)return 0;
	return fac[n]*invFac[n-m]%mod*invFac[m]%mod;
}
void Init(){
	fac[0]=1;
	mi[0]=1;
	for(int i=1;i<=n;i++)fac[i]=fac[i-1]*i%mod;
	invFac[n]=qpow(fac[n],mod-2);
	for(int i=n-1;i>=0;i--)invFac[i]=invFac[i+1]*(i+1)%mod;
	for(int i=1;i<=n;i++)mi[i]=mi[i-1]*2%mod;
}
int main(){
	scanf("%lld",&n);Init();
	for(int i=n/2+1;i<=n;i++)sum=(sum+((C(n,i)*mi[n-i])%mod))%mod;
	sum=(qpow(3,n)-sum*2%mod+mod)%mod;
	printf("%lld\n",sum);
	return 0;
}

感受

就好巧妙的转化,是我不配了呜呜呜呜呜

翻译: Storage Engine Options Storage engines are built as plugins. You can build a plugin as a static module (compiled into the server) or a dynamic module (built as a dynamic library that must be installed into the server using the INSTALL PLUGIN statement or the --plugin-load option before it can be used). Some plugins might not support static or dynamic building. The InnoDB, MyISAM, MERGE, MEMORY, and CSV engines are mandatory (always compiled into the server) and need not be installed explicitly. To compile a storage engine statically into the server, use -DWITH_engine_STORAGE_ENGINE=1. Some permissible engine values are ARCHIVE, BLACKHOLE, EXAMPLE, and FEDERATED. Examples: -DWITH_ARCHIVE_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 To build MySQL with support for NDB Cluster, use the WITH_NDB option. Note It is not possible to compile without Performance Schema support. If it is desired to compile without particular types of instrumentation, that can be done with the following CMake options: DISABLE_PSI_COND DISABLE_PSI_DATA_LOCK DISABLE_PSI_ERROR DISABLE_PSI_FILE DISABLE_PSI_IDLE DISABLE_PSI_MEMORY DISABLE_PSI_METADATA DISABLE_PSI_MUTEX DISABLE_PSI_PS DISABLE_PSI_RWLOCK DISABLE_PSI_SOCKET DISABLE_PSI_SP DISABLE_PSI_STAGE DISABLE_PSI_STATEMENT DISABLE_PSI_STATEMENT_DIGEST DISABLE_PSI_TABLE DISABLE_PSI_THREAD DISABLE_PSI_TRANSACTION For example, to compile without mutex instrumentation, configure MySQL using -DDISABLE_PSI_MUTEX=1. To exclude a storage engine from the build, use -DWITH_engine_STORAGE_ENGINE=0. Examples: -DWITH_ARCHIVE_STORAGE_ENGINE=0 -DWITH_EXAMPLE_STORAGE_ENGINE=0 -DWITH_FEDERATED_STORAGE_ENGINE=0 It is also possible to exclude a storage engine from the build using -DWITHOUT_engine_STORAGE_ENGINE=1 (but -DWITH_engine_STORAGE_ENGINE=0 is preferred). Examples: -DWITHOUT_ARCHIVE_STORAGE_ENGINE=1 -DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 -DWITHOUT_FEDERATED_STORAGE_ENGINE=1 If neither -DWITH_engine_STORAGE_ENGINE nor -DWITHOUT_engine_STORAGE_ENGINE are specified for a given storage engine, the engine is built as a shared module, or excluded if it cannot be built as a shared module.
04-04
<think>好的,我现在需要处理用户提供的关于MySQL存储引擎选项的翻译内容。首先,用户之前已经询问过关于禁用分区存储引擎的编译选项,现在他们希望将一段英文的技术文档翻译成中文,并且可能需要进一步的解释。 首先,我需要通读用户提供的英文内容,理解其中的技术术语和关键点。内容主要涉及MySQL存储引擎的编译选项,包括静态和动态模块的构建方式,以及如何启用或禁用特定存储引擎。还有一些关于性能模式(Performance Schema)的配置选项。 接下来,我需要确保翻译准确且符合技术规范。例如,“Storage engines are built as plugins”需要准确翻译为“存储引擎以插件形式构建”,同时保持术语的一致性。注意用户之前提到的格式要求,比如行内数学表达式用$...$,但在这个翻译任务中可能不涉及数学公式,但需要正确使用代码块和列表格式。 用户可能希望翻译后的内容结构清晰,技术术语准确,并且符合中文技术文档的常见表达方式。同时,需要检查是否有需要进一步解释的地方,例如某些编译选项的具体影响或使用场景,但根据用户的要求,可能只需要翻译,不需要额外解释,除非用户特别提出。 在翻译过程中,需要注意专有名词的正确处理,例如“InnoDB”、“MyISAM”、“MERGE”等存储引擎名称不需要翻译。同时,注意选项的格式,例如“-DWITH_ARCHIVE_STORAGE_ENGINE=1”需要保留原样,并用代码块包裹以确保格式正确。 另外,用户提供的英文内容中提到了两种禁用存储引擎的方式:使用“=0”和“=1”的不同选项,这里需要明确翻译,避免混淆。例如,“-DWITH_engine_STORAGE_ENGINE=0”和“-DWITHOUT_engine_STORAGE_ENGINE=1”的区别需要准确传达,虽然功能相同,但推荐使用前者。 还要注意注释部分,例如“Note”部分需要转换为中文的“注意”,并保持内容的警示性。性能模式相关的选项需要逐一翻译,确保每个DISABLE_PSI_*选项都正确对应,例如“DISABLE_PSI_MUTEX”翻译为“禁用互斥锁监控”。 最后,检查整个翻译的结构是否符合用户之前要求的层次结构,使用标题、列表和代码块来增强可读性。确保没有遗漏任何技术细节,同时保持语言流畅自然,符合技术文档的标准。 可能存在的难点在于保持技术术语的一致性,以及处理长句的流畅性。需要多次通读译文,确保专业性和准确性。同时,用户可能希望翻译后的内容可以直接用于配置MySQL,因此必须确保所有命令和选项的正确性,避免翻译错误导致配置问题。 总结来说,我需要逐段翻译,保持原意,正确使用格式,并确保技术术语的准确性,同时遵循用户之前提供的格式要求。完成后,再次检查是否有错译或格式错误,确保用户能够顺利使用翻译后的文档进行MySQL的编译和配置。</think>以下是关于MySQL存储引擎选项的技术翻译,内容已按规范格式整理: --- ### **存储引擎选项** 存储引擎以插件形式构建。其编译方式分为两种: - **静态模块**:直接编译到服务器中,无需额外安装。 - **动态模块**:编译为动态库,需通过 `INSTALL PLUGIN` 语句或 `--plugin-load` 选项加载后才能使用。 *注:部分插件可能不支持静态或动态编译。* --- ### **默认内置引擎** 以下引擎为**强制内置引擎**(始终编译到服务器中,无需显式安装): - InnoDB - MyISAM - MERGE - MEMORY - CSV --- ### **静态编译存储引擎** 使用 `-DWITH_engine_STORAGE_ENGINE=1` 参数将指定引擎静态编译到服务器。 **支持的引擎类型**包括:`ARCHIVE`, `BLACKHOLE`, `EXAMPLE`, `FEDERATED`。 **示例**: ```bash cmake . -DWITH_ARCHIVE_STORAGE_ENGINE=1 cmake . -DWITH_BLACKHOLE_STORAGE_ENGINE=1 ``` *注:如需支持NDB Cluster,需使用 `WITH_NDB` 选项。* --- ### **性能模式(Performance Schema)限制** **无法完全禁用性能模式**,但可通过以下CMake选项禁用特定类型的监控: ```bash -DDISABLE_PSI_COND=1 # 禁用条件变量监控 -DDISABLE_PSI_DATA_LOCK=1 # 禁用数据锁监控 -DDISABLE_PSI_ERROR=1 # 禁用错误监控 -DDISABLE_PSI_FILE=1 # 禁用文件操作监控 -DDISABLE_PSI_IDLE=1 # 禁用空闲状态监控 -DDISABLE_PSI_MEMORY=1 # 禁用内存使用监控 -DDISABLE_PSI_METADATA=1 # 禁用元数据监控 -DDISABLE_PSI_MUTEX=1 # 禁用互斥锁监控 -DDISABLE_PSI_PS=1 # 禁用预编译语句监控 -DDISABLE_PSI_RWLOCK=1 # 禁用读写锁监控 -DDISABLE_PSI_SOCKET=1 # 禁用套接字操作监控 -DDISABLE_PSI_SP=1 # 禁用存储过程监控 -DDISABLE_PSI_STAGE=1 # 禁用阶段监控 -DDISABLE_PSI_STATEMENT=1 # 禁用语句执行监控 -DDISABLE_PSI_STATEMENT_DIGEST=1 # 禁用语句摘要监控 -DDISABLE_PSI_TABLE=1 # 禁用表操作监控 -DDISABLE_PSI_THREAD=1 # 禁用线程监控 -DDISABLE_PSI_TRANSACTION=1 # 禁用事务监控 ``` **示例**(禁用互斥锁监控): ```bash cmake . -DDISABLE_PSI_MUTEX=1 ``` --- ### **从编译中排除存储引擎** 使用 `-DWITH_engine_STORAGE_ENGINE=0` 参数排除指定引擎。 **推荐方式**(优先使用`=0`语法): ```bash -DWITH_ARCHIVE_STORAGE_ENGINE=0 -DWITH_EXAMPLE_STORAGE_ENGINE=0 -DWITH_FEDERATED_STORAGE_ENGINE=0 ``` **等效替代方式**(`=1`语法): ```bash -DWITHOUT_ARCHIVE_STORAGE_ENGINE=1 -DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 -DWITHOUT_FEDERATED_STORAGE_ENGINE=1 ``` --- ### **默认编译规则** 若未指定 `WITH_engine_STORAGE_ENGINE` 或 `WITHOUT_engine_STORAGE_ENGINE`: 1. 引擎将被编译为**共享模块**(动态库)。 2. 若引擎不支持动态编译,则**直接排除**。 --- ### **关键说明** - 静态编译引擎无需运行时加载,但会增加服务器二进制文件体积。 - 动态编译引擎需手动管理依赖,但支持热加载和卸载。 - 排除非必要引擎可减少潜在安全风险并优化性能。 如需进一步解释特定选项,可提供具体引擎名称进行扩展说明。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值