前言
这是之前听闻的一道比较妙的题,现在感觉还是记录一下比较好
题目
给出
n
(
1
≤
n
≤
1000000
)
n(1\le n\le1000000)
n(1≤n≤1000000),并且给你
n
n
n个数
a
1
⋅
⋅
⋅
a
n
(
0
≤
a
i
<
n
)
a_1···a_n(0\le a_i< n)
a1⋅⋅⋅an(0≤ai<n)
让你从其中选出一些数,使得这些数的和模
n
n
n为
0
0
0,输出任意一种方案,无解输出
−
1
-1
−1
这是小学数学题
不要轻言放弃
这是小学数学题
不要轻言放弃
这是小学数学题
不要轻言放弃
这是小学数学题
不要轻言放弃
暴力
作为一名OIer背包是非常好想的吧^ _ ^,复杂度 Θ ( n 2 ) \Theta(n^2) Θ(n2),显然不能过
这是小学数学题
不要轻言放弃
这是小学数学题
不要轻言放弃
这是小学数学题
不要轻言放弃
这是小学数学题
不要轻言放弃
题解
一个结论,我们一定能够取出连续的一段使得这些数的和为
n
n
n
证明用到的是小学数学知识抽屉原理,对于前缀和模
n
n
n的值一共有
n
+
1
n+1
n+1个,任意两个前缀对应一个子段,由于一个数模
n
n
n只有
n
n
n个取值,所以一定有两个前缀的前缀和模
n
n
n相同,取出即可
复杂度
Θ
(
n
)
\Theta(n)
Θ(n),通过此题!
总结
这是一道考验思维的趣题
脑子是个好东西