原题
对于数学题,建模是最重要的
题面简化
1.有
N
N
N个不重复的数
2.从
N
N
N个数中取两个非空集合
A
A
A 和
B
B
B
3.
∀
a
i
∈
A
,
∀
b
i
∈
B
,
a
i
>
b
i
\forall a_i\in A,\forall b_i\in B,a_i>b_i
∀ai∈A,∀bi∈B,ai>bi
数据范围
对于
20
%
20\%
20%的数据
N
≤
10
N\leq10
N≤10
对于
40
%
40\%
40%的数据
N
≤
1
0
3
N\leq10^3
N≤103
对于
60
%
60\%
60%的数据
N
≤
1
0
5
N\leq10^5
N≤105
对于
100
%
100\%
100%的数据
N
≤
1
0
9
N\leq10^9
N≤109
一看就看出要 O ( 1 ) O(1) O(1) 的时间复杂度,明显是数学题
思路
若 N ≤ 1 0 3 N\leq10^3 N≤103
看到n个数不相同,选数和大小相关,就发现需要排序。
把 N N N个数排成一数列,用 1 , 0 1,0 1,0 表示 取 或 不取 。(只是更直观了些)
因为
∀
a
∈
A
,
∀
b
∈
B
,
a
>
b
\forall a\in A,\forall b\in B,a>b
∀a∈A,∀b∈B,a>b
所以可以记录
B
B
B中的最大值、
A
A
A中的最小值 在数列中的位置,这里设为
i
i
i和
j
j
j,要枚举所有
i
<
j
i<j
i<j 的情况。
选定
i
,
j
i,j
i,j后,易得
集
合
A
的
选
择
方
案
数
=
2
i
−
1
集合A的选择方案数=2^{i-1}
集合A的选择方案数=2i−1,
集
合
B
的
选
择
方
案
数
=
2
N
−
j
集合B的选择方案数=2^{N-j}
集合B的选择方案数=2N−j,
则有
∑
i
=
1
N
−
1
∑
j
=
i
+
1
N
2
N
−
(
j
−
i
+
1
)
\sum_{i=1}^{N-1}\sum_{j=i+1}^{N} 2^{N-(j-i+1)}
i=1∑N−1j=i+1∑N2N−(j−i+1)
快速幂复杂度先忽略我不会算 ,到这里是
O
(
n
2
)
O(n^2)
O(n2)
若 N ≤ 1 0 5 N\leq10^5 N≤105
观察上一个式子,我们可以发现 有的指数是被重复计算的 ,
所以可以换一种枚举方式,枚举 原
i
i
i
j
j
j 间的不选的数字个数(包括i和j),
设为
k
k
k ,则
k
=
j
−
i
+
1
k=j-i+1
k=j−i+1
则有
∑
i
=
2
N
(
N
−
i
+
1
)
∗
2
N
−
i
\sum_{i=2}^{N}(N-i+1)*2^{N-i}
i=2∑N(N−i+1)∗2N−i
即
∑
i
=
1
N
−
1
i
∗
2
i
−
1
\sum_{i=1}^{N-1}i*2^{i-1}
i=1∑N−1i∗2i−1
连快速幂都不需要,到这里是
O
(
n
)
O(n)
O(n)
若 N ≤ 1 0 9 N\leq10^9 N≤109
从 O ( n ) O(n) O(n)到 O ( 1 ) O(1) O(1)是极难跨越的一步(废话)
众所周知,
∑
i
=
0
n
2
i
=
2
n
+
1
−
1
\sum_{i=0}^{n}2^{i}=2^{n+1}-1
i=0∑n2i=2n+1−1
所以,
∑
i
=
1
N
−
1
i
∗
2
i
−
1
=
∑
i
=
0
N
−
2
(
2
N
−
1
−
1
)
−
(
2
i
−
1
)
=
(
N
−
1
)
∗
2
N
−
1
−
2
N
−
1
=
(
N
−
2
)
∗
2
N
−
1
−
1
\sum_{i=1}^{N-1}i*2^{i-1}=\sum_{i=0}^{N-2}(2^{N-1}-1)-(2^{i}-1)=(N-1)*2^{N-1}-2^{N-1}=(N-2)*2^{N-1}-1
i=1∑N−1i∗2i−1=i=0∑N−2(2N−1−1)−(2i−1)=(N−1)∗2N−1−2N−1=(N−2)∗2N−1−1
第二步时用了前缀和的思想,之后就很简单地推出来了
复杂度 O ( 1 ) O(1) O(1) ,要加一个快速幂取模
代码
快速幂模板