CW初中-C0106D
稍微重复一下题意,有 \(n\) 个数 \(a_i\),将其以一种顺序串联成一个“大数”,使这个数对 \(11\) 取模的结果为 \(0\),求一共有多少个不同的顺序?方案数对 \(998244353\) 取模。另外,相同的数若在 \(a\) 数组中多次出现,则视为不同的数。
\(0 \leq a_i \leq 10^9, 0 < n \leq 2000\)
首先许多同学会首先想到 \(11\) 倍数的性质:“两头一拉,中间相加”。但是信息学竞赛生的直觉告诉我们若将此题化为这样的问题只是在使题目变复杂。
所以我们做题的一个首要步骤是将题目化简或变得易懂、更易思考、更易入手、更易实现。
性质:
设:
\(10^pa \equiv b \; (mod\;11)\),其中 \(b\) 满足 \(0 \leq b < 11\)。
结论:
设:
\( e_i = \begin{cases} 1 & ((\log_{10}{a_i}) + 1) \; is \; odd \\ -1 & ((\log_{10}{a_i}) + 1) \; is \; even \\ \end{cases} \)
假设有一种已知顺序 \(b_1,b_2,b_3...b_n\)。
由上述性质得:
若 \(b_1,b_2,b_3...b_n\) 为一种合法的顺序,则有:
解释一下,由上述性质可知一个 \(a_i\) 对总和的影响取决于它后面的位数,若 \(a_i\) 向低位的位数为奇数,则将总和减去 \(a_i\),否则将总和加上 \(a_i\)。
剩下的求方案数就是 DP 的事了,这种式子下的转移就十分地简单,而且有多种转移方式(我的方法比较蠢)。如果想不到就问问教练或身边的其他同学,如果实在不清楚,也可以在评论区留言,我看情况把我的 DP 方程放上来。当然有自己的转移方法的也可以在评论区提出。
给一个提示,可以将 \(e_i\) 分正负分别讨论DP方程,然后再用乘法原理之类的组合起来。
因为我累了,所以这篇博客就到这里吧。
本文作者:saubguiu
本文链接:https://www.cnblogs.com/imcaigou/p/17883915.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步