0%

The 6th Liaoning Provincial Collegiate Programming Contest-2025-辽宁省赛-E. Entering the unknown(≤d 比=d 好计数更多,那为什么不使用 f(≤d)-f(≤d-1) 得到 f(=d) 呢?)

题目大意

题目描述
给定一个长度为 nn 的正整数数组,求有多少个非空连续子数组满足以下条件:子数组内所有元素的和,能够被该子数组中所有元素包含的数字字符的最大值整除。

(注:数字字符指组成数字的 090 \sim 9。例如,数组 [2025, 11, 15] 中包含的数字字符有 0,1,2,50, 1, 2, 5,其最大值为 55。)

输入格式
第一行包含一个整数 TT1T1041 \le T \le 10^4),表示测试用例的数量。
对于每个测试用例:
第一行包含一个整数 nn1n1051 \le n \le 10^5),表示数组长度。
第二行包含 nn 个正整数 x1,x2,,xnx_1, x_2, \dots, x_n1xi1091 \le x_i \le 10^9),表示数组元素。
保证所有测试用例中 nn 的总和不超过 10510^5

输出格式
对于每个测试用例,输出一行一个整数,表示满足条件的非空子数组数量。

样例输入

1
2
3
4
5
2
3
213 12 21
7
314 880 246 170 493 474 129

样例输出

1
2
4
7

样例解释
以第一个测试用例 [213, 12, 21] 为例,考察其所有非空子数组:

  • [213]:包含数字 1,2,31, 2, 3,最大数字为 33。子数组元素和为 213213213mod3=0213 \bmod 3 = 0满足条件

  • [12]:包含数字 1,21, 2,最大数字为 22。子数组元素和为 121212mod2=012 \bmod 2 = 0满足条件

  • [21]:包含数字 1,21, 2,最大数字为 22。子数组元素和为 212121mod2021 \bmod 2 \neq 0,不满足条件。

  • [213, 12]:包含数字 1,2,31, 2, 3,最大数字为 33。子数组元素和为 213+12=225213 + 12 = 225225mod3=0225 \bmod 3 = 0满足条件

  • [12, 21]:包含数字 1,21, 2,最大数字为 22。子数组元素和为 12+21=3312 + 21 = 3333mod2033 \bmod 2 \neq 0,不满足条件。

  • [213, 12, 21]:包含数字 1,2,31, 2, 3,最大数字为 33。子数组元素和为 213+12+21=246213 + 12 + 21 = 246246mod3=0246 \bmod 3 = 0满足条件

满足条件的子数组共有 4 个。

思路讲解

≤d 比=d 好计数得多,那为什么不使用 f(≤d)-f(≤d-1) 得到 f(=d) 呢?

不过,要注意到,就是光一个 d 是不够描述这个 f 函数的。

定义 $ f(≤d,big_d)$ 指的是最大 digit 是 d≤d 而且可以被 bigdbig_d 整除的这个子段数量。

因此,不难发现 $ f(=d,big_d)=f(≤d,big_d)-f(≤d-1,big_d)$。

使用这一容斥方法解决该问题,是因为我们发现在编程中,我们发现,很难对 最大 digit=d 进行计数(你要是不信的话可以自此试试)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
for (int big_d=1;big_d<=9;++big_d) {
vector<ll> F(10+2);
for (int d=big_d-1;d<=big_d;++d) {
vector<ll> R(big_d);
for (int i=1;i<=N;++i) {
if (mx_d[i]>d) {
// if (find_mx) {
// ans+=R[0];
// }
R.assign(big_d,0);
continue;
}
// cal(A[i]);
ll rem=A[i]%big_d;
rotate(R.rbegin(),R.rbegin()+rem,R.rend());
R[rem]++;
F[d]+=R[0];

// if (find_mx) {
// ans+=R[0];
// }
}
}
ans+=F[big_d]-F[big_d-1];
}

AC代码

AC
https://codeforces.com/gym/106380/submission/366441214

心路历程(WA,TLE,MLE……)