D Without Carry
具体题面见上述链接
题目大意
一个长度为
N
N
N 的序列
A
1..
n
A_{1..n}
A1..n
有多少组不同的(
i
,
j
i,j
i,j)
满足在计算
A
i
+
A
j
A_i + A_j
Ai+Aj 时, 不发生进位。
··············
(
i
1
,
j
1
i_1, j_1
i1,j1) 和
(
j
1
,
i
1
)
(j_1,i_1)
(j1,i1) 视为相同
两数相加不发生进位。即这两个数的每一权值相同的位相加,都小于10。
比如 12 +21 没有发生进位:十位(1 + 2 < 10) 个位 (2 + 1 < 10)
12 + 19 发生了进位
题解
我们用
X
[
1
0
k
]
X[10^{k}]
X[10k] 表示数
X
X
X 中,权值为
1
0
k
10^k
10k 的那一位的数
根据题意, 任意
X
+
Y
X+ Y
X+Y 要满足不发生进位,就是要满足对于所有的
k
k
k ,
X
[
1
0
k
]
+
Y
[
1
0
k
]
<
10
X[10^k] + Y[10^k] < 10
X[10k]+Y[10k]<10,化简得
X
[
1
0
k
]
≤
9
−
Y
[
1
0
k
]
X[10^k] \le 9 - Y[10^k]
X[10k]≤9−Y[10k]
本题
A
i
<
1000000
A_i < 1000000
Ai<1000000 也就是
1
≤
k
≤
6
1 \le k \le 6
1≤k≤6
解决:对于任意
i
i
i ,有多少
j
j
j 能组成一对(
i
,
j
i, j
i,j)。
此时我们要找出满足的
A
j
A_j
Aj ,使得
A
j
[
1
0
k
]
≤
9
−
A
i
[
1
0
k
]
(
1
≤
k
≤
6
)
A_j[10^k] \le 9 - A_i[10^k](1\le k\le6)
Aj[10k]≤9−Ai[10k](1≤k≤6)
根据上述结论,我们令
T
[
1
0
k
]
=
9
−
A
i
[
1
0
k
]
(
1
≤
k
≤
6
)
T[10^k] =9 - A_i[10^k] (1\le k\le6)
T[10k]=9−Ai[10k](1≤k≤6)
于是,我们就有了“有多少
j
j
j ,满足
A
j
[
1
0
k
]
≤
T
[
1
0
k
]
(
1
≤
k
≤
6
)
A_j[10^k] \le T[10^k](1\le k\le 6)
Aj[10k]≤T[10k](1≤k≤6)”。
我们只要定义一个数组
C
[
B
1
]
[
B
2
]
[
B
3
]
[
B
4
]
[
B
5
]
[
B
6
]
C[B1][B2][B3][B4][B5][B6]
C[B1][B2][B3][B4][B5][B6]
来维护,有多少
A
j
A_j
Aj 满足
A
j
[
1
0
k
]
≤
B
k
(
1
≤
k
≤
6
)
A_j[10^k] \le Bk (1 \le k \le 6)
Aj[10k]≤Bk(1≤k≤6)。也就是维护了有多少
A
j
A_j
Aj 满足
A
j
[
1
0
k
]
≤
T
[
1
0
k
]
(
1
≤
k
≤
6
)
A_j[10^k] \le T[10^k](1 \le k \le 6)
Aj[10k]≤T[10k](1≤k≤6)。
仔细观察发现, 数组
C
[
B
1
]
[
B
2
]
[
B
3
]
[
B
4
]
[
B
5
]
[
B
6
]
C[B1][B2][B3][B4][B5][B6]
C[B1][B2][B3][B4][B5][B6] 其实就是6维前缀和,直接维护6维前缀和,效率无法满足要求。我们需要使用树状数组的方式对每一维进行维护,来均摊维护的效率。
我的代码