首页 > 其他分享 >[题解] HDU7060 Separated Number 思路整理

[题解] HDU7060 Separated Number 思路整理

时间:2022-11-03 13:48:15浏览次数:96  
标签:Separated HDU7060 right 题解 sum len times binom left

题目链接

HDU7060 Separated Number

题目大意

给一个 \(n\) 位数,把该数字分成 \(k\) 段,每种方案的贡献为其分割出的段的数字之和。求所有分法的贡献之和(对 \(998244353\) 取模)。

做法

枚举数位,计算每个数位的贡献。

令这个 \(n\) 位数从高到低第 \(i\) 位为 \(a_i\),那么可以枚举 \(a_i\) 属于分割出的哪段数以统计贡献。

设 \(a_i\) 被分到了 \(a_L\) ~ \(a_R\) 段,此时 \(a_i\) 的贡献为 \(a_i\times10^{R-i}\),考虑一下情况:

  • 当 \(1<L\) 且 \(R<n\) 时,该段左右两边都有其他段,所以相当于余下的 \(n-(R-L+1)\) 位中插入了一块隔板,方案数为 \(\sum_{j=1}^{k-2}\binom{n-(R-L+1)-1-1}{j-1}=\sum_{j=0}^{k-3}\binom{n-(R-L+1)-2}{j}\)。
  • 当 \(L=1\) 且 \(R=n\) 时,没有剩下的数,方案数为 \(1\)。
  • 当 \(L=1\) 或 \(R=n\) 时(\(L\)、\(R\) 不同时等于 \(n\)),那么只有一边有段,方案即为 \(\sum_{j=1}^{k-1}\binom{n-(R-L+1)-1}{j-1}=\sum_{j=0}^{k-2}\binom{n-(R-L+1)-1}{j}\)。

加起来即为答案。

\(ans_1=\sum_{L=2}^{n-1}\sum_{R=L}^{n-1}\left(\sum_{i=L}^Ra_i\times10^{R-i}\right)\times\left(\sum_{j=0}^{k-3}\binom{n-(R-L+1)-2}{j}\right) (L>1\land R<n)\)

\(ans_2=\sum_{i=1}^n a_i\times10^{n-i} (L=1 \land R=n)\)

\(ans_3=\sum_{R=1}^{n-1}\left(\sum_{i=1}^Ra_i10^{R-i}\right)\times\left(\sum_{j=0}^{k-2}\binom{n-R-1}{j}\right) (L=1 \land R<n)\)

\(ans_4=\sum_{L=2}^n\left(\sum_{i=L}^na_i10^{n-i}\right)\times\left(\sum_{j=0}^{k-2}\binom{L-2}{j}\right) (L>1\land R=n)\)

\(ans=ans_1+ans_2+ans_3+ans_4\)

不妨设:

\(f(n)=\sum_{i=1}^n a_i10^{-i}\)

\(g(n)=\sum_{i=1}^n 10^if(i)\)

\(h(n,m)=\sum_{i=0}^m\binom{n}{i}\)

那么:


\(ans_1\)

\(=\sum_{L=2}^{n-1}\sum_{R=L}^{n-1}\left(\sum_{i=L}^Ra_i10^{R-i}\right)\times\left(\sum_{j=0}^{k-3}\binom{n-(R-L+1)-2}{j}\right)\)

\(=\sum_{len=1}^{n-2}\sum_{R=len+1}^{n-1}\left(\sum_{i=R-len+1}^Ra_i10^{R-i}\right)\times\left(\sum_{j=0}^{k-3}\binom{n-len-2}{j}\right)\)

\(=\sum_{len=1}^{n-2}h(n-len-2,k-3)\sum_{R=len+1}^{n-1}\left(\sum_{i=R-len+1}^Ra_i10^{R-i}\right)\)

\(=\sum_{len=1}^{n-2}h(n-len-2,k-3)\sum_{R=len+1}^{n-1}10^R\left(\sum_{i=R-len+1}^Ra_i10^{-i}\right)\)

\(=\sum_{len=1}^{n-2}h(n-len-2,k-3)\sum_{R=len+1}^{n-1}10^R(f(R)-f(R-len))\)

\(=\sum_{len=1}^{n-2}h(n-len-2,k-3)\left[\left(\sum_{R=len+1}^{n-1}10^Rf(R)\right)-\left(\sum_{R=len+1}^{n-1}10^Rf(R-len)\right)\right]\)

\(=\sum_{len=1}^{n-2}h(n-len-2,k-3)\left[\left(\sum_{R=len+1}^{n-1}10^Rf(R)\right)-10^{len}\left(\sum_{R=len+1}^{n-1}10^{R-len}f(R-len)\right)\right]\)

\(=\sum_{len=1}^{n-2}h(n-len-2,k-3)\left[g(n-1)-g(len)-10^{len}g(n-1-len)\right]\)


\(ans_2\)

\(=\sum_{i=1}^n a_i10^{n-i}=10^n\sum_{i=1}^na_i10^{-i}=10^nf(n)\)


\(ans_3\)

\(=\sum_{R=1}^{n-1}\left(\sum_{i=1}^Ra_i10^{R-i}\right)\times\left(\sum_{j=0}^{k-2}\binom{n-R-1}{j}\right)\)

\(=\sum_{R=1}^{n-1}10^R\left(\sum_{i=1}^Ra_i10^{-i}\right)\times h(n-R-1,k-2)\)

\(=\sum_{R=1}^{n-1}10^Rf(R)\times h(n-R-1,k-2)\)


\(ans_4\)

\(=\sum_{L=2}^n\left(\sum_{i=L}^na_i10^{n-i}\right)\times\left(\sum_{j=0}^{k-2}\binom{L-2}{j}\right)\)

\(=\sum_{L=2}^n10^n\left(\sum_{i=L}^na_i10^{-i}\right)\times h(L-2,k-2)\)

\(=\sum_{L=2}^n10^n(f(n)-f(L-1))\times h(L-2,k-2)\)


不难求出 \(f(x)\) 和 \(g(x)\),如何求 \(h(n,m)\) 呢?

由定义可以发现 \(h(n,m)\) 表示的是 \(n\) 个位置选不超过 \(m\) 个位置的方案数,考虑使用容斥,从 \(h(n-1,m)\) 得到 \(h(n,m)\)。

  • \(h(n,m)\) 是 \(1\) ~ \(n-1\) 选不超过 \(m\) 个位置的方案数,也是 \(2\) ~ \(n\) 选不超过 \(m\) 个位置的方案数。
  • 两区间相加,重叠部分为 \(1\)、\(n\) 位置都不选,\(2\) ~ \(n-1\) 选不超过 \(m\) 个位置的方案数,即 \(\sum_{i=0}^m\binom{n-2}{i}\)。
  • 缺少部分为 \(1\)、\(n\) 位置都选,\(2\) ~ \(n-1\) 选不超过 \(m-2\) 个位置的方案数,即 \(\sum_{i=0}^{m-2}\binom{n-2}{i}\)。

可得:

\(h(n,m)\)

\(=2\times h(n-1,m)-\sum_{i=0}^m\binom{n-2}{i}+\sum_{i=0}^{m-2}\binom{n-2}{i}\)

\(=2\times h(n-1,m)-\binom{n-2}{m-1}-\binom{n-2}{m}\)

\(=2\times h(n-1,m)-\binom{n-1}{m}\)

注意到答案式中仅含 \(h(w,k-2)\) 和 \(h(w,k-3)\),那么可以分别 \(O(n)\) 求出。

\(f(n)\) 和 \(g(n)\) 也可 \(O(n)\) 处理,再 \(O(n)\) 计算答案,故总复杂度 \(O(n)\)。

代码

const ll mod = 998244353;
const int N = 1000010, M = 1000000;
int t, n, k, a[N];
char c[N];
ll inv[N], fac[N], finv[N], ten[N], f[N], g[N], h1[N], h2[N];
inline ll C(ll n, ll m) {
	if (m > n) return 0;
	if (m == n || n == 0) return 1;
	return fac[n] * finv[m] % mod * finv[n - m] % mod;
}
inline ll calc() {
	ll res = ten[n] * f[n] % mod;
	if (k == 1) return res;
	for (int R = 1; R <= n - 1; R++) 
		res = (res + ten[R] * f[R] % mod * h1[n - R - 1] % mod) % mod;
	for (int L = 2; L <= n; L++) 
		res = (res + ten[n] * ((f[n] + mod - f[L - 1]) % mod) % mod * h1[L - 2]) % mod;
	if (k == 2) return res;
	for (int len = 1; len <= n - 2; len++)
		res = (res + h2[n - len - 2] * (((g[n - 1] + mod - g[len]) % mod + mod - ten[len] * g[n - 1 - len] % mod) % mod) % mod) % mod;
	return res;
}
int main() {
	fac[0] = fac[1] = 1;
	for (int i = 2; i <= M; i++) fac[i] = fac[i - 1] * i % mod;
	inv[1] = 1;
	for (int i = 2; i <= M; i++) inv[i] = (mod - (mod / i) * inv[mod % i]) % mod;
	finv[0] = finv[1] = 1;
	for (int i = 2; i <= M; i++) finv[i] = finv[i - 1] * inv[i] % mod;
	ten[0] = 1;
	for (int i = 1; i <= M; i++) ten[i] = ten[i - 1] * 10 % mod;	

	t = read();
	while (t--) {
		k = read();
		scanf("%s", c + 1);
		n = strlen(c + 1);
		for (int i = 1; i <= n; i++) a[i] = c[i] ^ 48;
		
		for (int i = 1; i <= n; i++) h1[i] = h2[i] = 0;
		ll iv10 = inv[10];
		for (int i = 1; i <= n; i++) {
			f[i] = (f[i - 1] + iv10 * a[i] % mod) % mod;
			iv10 = iv10 * inv[10] % mod;
		}
		for (int i = 1; i <= n; i++) g[i] = (g[i - 1] + f[i] * ten[i] % mod) % mod;
		h1[0] = h2[0] = 1;
		if (k >= 2)
			for (int i = 1; i <= n; i++) h1[i] = ((h1[i - 1] << 1) % mod + mod - C(i - 1, k - 2)) % mod;
		if (k >= 3)
			for (int i = 1; i <= n; i++) h2[i] = ((h2[i - 1] << 1) % mod + mod - C(i - 1, k - 3)) % mod;
		
		printf("%lld\n", calc());
	}
	return 0;
}

参考资料

[组合数学] HDU 7060 Separated Number - AE酱

标签:Separated,HDU7060,right,题解,sum,len,times,binom,left
From: https://www.cnblogs.com/shiranui/p/16854191.html

相关文章

  • java 中文乱码问题解决思路
    碰到中文乱码,引起的原因一般为,在编写程序的时候的编码方式与查看的时候的编码方式不一致,从而导致了中文乱码。碰到这种问题,首先要做的就是查看自己编码方式,以String为例St......
  • 2022.11.2 模拟赛题解
    简要题意给定一棵\(n\)个节点的有根树,树根为\(1\)号节点,每个结点有一个权值\(a_i(|a_i|\leq10^9)\),求包含\(1\)的前\(k\)小的连通块的权值。简要题解前置内......
  • 11.2 解题报告&CSP-S 2022题解
    T1用时:\(1\)h期望得分:\(70\)~\(80\)实际得分:\(55\)这题考场写了个常数比较小的\(O(n^3)\)的做法,期望得分\(75\)左右,但是由于bfs忘记打标记导致MLE和TLE,挂......
  • P8671 [蓝桥杯 2018 国 AC] 约瑟夫环 题解
    约瑟夫环有\(\mathcalO(n)\)做法相信大家都知道。这里就不在介绍了,这里给出一个不知道这个结论的\(\mathcalO(n\logn)\)简单做法。考虑直接模拟题意,每次循环往后数......
  • [题解]CF1327F
    首先拆位,然后考虑限制会带来什么。要求与起来是\(1\)的必须全是\(1\),差分打个标记。要求与起来是\(0\)的必须至少有一个\(0\),考虑如何计数。计数问题有可能是动态......
  • CF1729G Cut Substrings 题解
    CF1729GCutSubstrings给出两个字符串\(s,t\),每次可以将字符串\(s\)中任意一个为\(t\)的子串删除,删除位置的字符变为空格(或理解为无实义)。求最少删除几次可以使得......
  • SOJ1669 题解
    题意传送门给定长度为\(N\)的数组\(a\)与\(Q\)个区间,还有一个整数\(M\)。你可以将至多\(M\)个\(a_i\)个变为\(0\),求\[\sum_{i=1}^Q\max_{l_i\lej\ler......
  • CF10E Greedy Change 题解
    http://codeforces.com/problemset/problem/10/E题意给出货币系统\(\{c_n\}\)满足\(c_1>c_2>\cdots>c_n=1\),请找到最小的\(x\)使贪心算法需要的货币数目比最优解多......
  • 未能加载文件或程序集 或它的某一个依赖项。试图加载格式不正确的程序。问题解决
    原因分析:操作系统是64位的,但发布的程序引用了一些32位的ddl,所以出现了兼容性的问题。 解决方案:IIS——应用程序池——高级设置——启用32位应用程序:true。下图这个地方......
  • CSP-S 2022 第二轮 题解
    T1.假期计划(holiday)这个题作为t1可一点都不简单啊。先用bfs\(O(nm)\)求出任意两点之间的最短路,这样就可以判断哪些点对可以排在一起。注意到第1、4个景点是对称的,第......