题面
现有 m m m
块石头围成一个圈(标记为 0 ∼ m − 1 0 \sim m - 1 0 ∼ m − 1
),n n n
只蛤在上面跳。
第 i i i
只蛤从 0 0 0
号石头开始跳,每一次跳跃恰好跳过 a i a_i a i
块石头。也就是说,如果蛤当前在第 j j j
块石头上,那么它下一次将跳到第 ( j + a i ) m o d m (j + a_i) \bmod m ( j + a i ) mod m
块石头上。
每当一只蛤跳到一块石头上,它就会对这块石头 “宣布主权”,一块石头可以被多只蛤 ”宣布主权”。求这 m m m
块石头中至少会被一只蛤 “宣布主权” 的所有石头的标号之和。
数据范围 :
1 ≤ n ≤ 10 4 1 \le n \le 10^4 1 ≤ n ≤ 1 0 4
1 ≤ m , a i ≤ 10 9 1 \le m, a_i \le 10^9 1 ≤ m , a i ≤ 1 0 9
题目链接
分析
首先我们考虑只有一只蛤的情景(记它的步长为 a a a
)。这实际上就是求 k ⋅ a m o d m k \cdot a \bmod m k ⋅ a mod m
有哪些值的一个数论问题。换句话说,就是解这样一个方程:
x = k a − t m
x = ka - tm
x = ka − t m
根据拓展欧几里得定理,x x x
的最小整数解即 gcd ( a , m ) \gcd(a, m) g cd( a , m )
,则该方程的整数解一定是 gcd ( a , m ) \gcd(a, m) g cd( a , m )
的倍数。换句话说,可以把蛤的步长等效地看作 gcd ( a , m ) \gcd(a, m) g cd( a , m )
。由此,出现的所有值的和为:
gcd ( a , m ) ⋅ [ 0 + 1 + 2 + ⋯ + m gcd ( a , m ) ]
\gcd(a, m) \cdot \left [ 0 + 1 + 2 + \dots + \frac{m}{\gcd(a, m)} \right ]
g cd( a , m ) ⋅ [ 0 + 1 + 2 + ⋯ + g cd( a , m ) m ]
那么回到有多只蛤的情景,我们需要解决的最大问题就是如何去重(一块石头可以被多只蛤 “宣布主权”)。有两种巧妙的方法可以解决这一问题:数论与容斥。
数论做法
分析
对于被多只蛤 “宣布主权” 的石头,我们不妨考虑对其进行某种规定使得它一定只属于一只蛤(尽管这只蛤可能不存在):
规定编号为 i i i
的石头只被步长为 gcd ( i , m ) \gcd(i, m) g cd( i , m )
的蛤占领 。
这样一来,步长为 l l l
的蛤就会占据所有标号为 l ⋅ k l \cdot k l ⋅ k
,其中 k k k
可取 [ 1 , m l ] [1, \frac{m}{l}] [ 1 , l m ]
中所有与 m l \frac{m}{l} l m
互质的数。
我们可以用反证的思想考虑一下。假设所取 k k k
与 m l \frac{m}{l} l m
不互质,不妨记 k = g ⋅ t 1 , m l = g ⋅ t 2 k = g \cdot t_1, \ \frac{m}{l} = g \cdot t_2 k = g ⋅ t 1 , l m = g ⋅ t 2
,即:m = g l ⋅ t 2 m = gl \cdot t_2 m = g l ⋅ t 2
。这样一来,当前石头的标号就可以表示为:
i = l ⋅ k = g l ⋅ t 1
i = l \cdot k = gl \cdot t_1
i = l ⋅ k = g l ⋅ t 1
故:
gcd ( i , m ) = g l ≠ l
\gcd(i, m) = gl \neq l
g cd( i , m ) = g l = l
与规定矛盾,得证一定是互质的。
既然互质,我们求和的时候可以借助一个结论:
在 [ 1 , x ] [1, x] [ 1 , x ]
中与 x x x
互素的数的和为:
1 2 φ ( x ) ⋅ x
\frac{1}{2} \varphi(x) \cdot x
2 1 φ ( x ) ⋅ x
下面附上一个简单推导:
我们所要求的就是对于所有满足 gcd ( x , i ) = 1 \gcd(x, i) = 1 g cd( x , i ) = 1
的 i i i
之和,由:
gcd ( x , i ) = gcd ( x , x − i )
\gcd(x, i) = \gcd(x, x - i)
g cd( x , i ) = g cd( x , x − i )
假设 i = x − i i = x - i i = x − i
,那么有 x = 2 i x = 2i x = 2 i
,并且 gcd ( x , i ) = i \gcd(x, i) = i g cd( x , i ) = i
。我们先考虑 x > 2 x > 2 x > 2
的情况,这样显然就与条件 gcd ( x , i ) = 1 \gcd(x, i) = 1 g cd( x , i ) = 1
矛盾了。因此对于 x > 2 x > 2 x > 2
,与 x x x
互素的数 i i i
与 x − i x - i x − i
必然是成对出现的,不会出现 i = x − i i = x - i i = x − i
的情况。
我们知道 gcd ( x , i ) = 1 \gcd(x, i) = 1 g cd( x , i ) = 1
的 i i i
的个数即 φ ( x ) \varphi(x) φ ( x )
。我们可以将这些数按照上面证明的方式划分为 1 2 φ ( x ) \frac{1}{2} \varphi(x) 2 1 φ ( x )
个数对 ⟨ x , x − i ⟩ \langle x, x - i\rangle ⟨ x , x − i ⟩
,每个数对的和为 x x x
,所以当 x > 2 x > 2 x > 2
时 [ 1 , x ] [1, x] [ 1 , x ]
中与 x x x
互素的数的和为:
1 2 φ ( x ) ⋅ x
\frac{1}{2} \varphi(x) \cdot x
2 1 φ ( x ) ⋅ x
通过代入 x = 2 x = 2 x = 2
,我们不难发现这对 x = 2 x = 2 x = 2
也成立。
我们剩下解决的问题是,可能石头 i i i
可被跳到但是我们规定其属于的那只蛤不存在。在这种情况下我们当然是要假装它存在了。在引入虚拟蛤时,如果存在某蛤步长为 l l l
,而新引入的虚拟蛤步长为 k ⋅ l k \cdot l k ⋅ l
,那么这显然都答案是没有任何影响的。根据规定,能占有石头的蛤的步长 l l l
一定是 m m m
的约数,所以我们可以考虑预处理出 l l l
的所有约数。 对于蛤 j j j
,若 a j a_j a j
可整除 m m m
的某因数 s s s
,则考虑加入 s s s
作为虚拟蛤,同时应用上面的公式计算出这只蛤所占有的石头下标之和。
也就是说,我们借助引入不影响答案的虚拟蛤,将石头分配给虚拟蛤就可以进行计算了。巧妙而完美。
例子
我们以第一组样例举一个例子:
2 12
9 10
对于第一只蛤,其等效步长为 gcd ( 9 , 12 ) = 3 \gcd(9, 12) = 3 g cd( 9 , 12 ) = 3
,因此它可以跳到的石头有:0 , 3 , 6 , 9 0, \ 3, \ 6, \ 9 0 , 3 , 6 , 9
。
对于第二只蛤,其等效步长为 gcd ( 10 , 12 ) = 2 \gcd(10, 12) = 2 g cd( 10 , 12 ) = 2
,因此它可以跳到的石头有:0 , 2 , 4 , 6 , 8 , 10 0, \ 2, \ 4, \ 6, \ 8, \ 10 0 , 2 , 4 , 6 , 8 , 10
。
我们预处理出 12 12 12
所有小于自身的约数:1 , 2 , 3 , 4 , 6 1, \ 2, \ 3, \ 4, \ 6 1 , 2 , 3 , 4 , 6
。除去本身就存在的 2 , 3 2, \ 3 2 , 3
,我们需要引入 4 4 4
(2 ∣ 4 2 | 4 2∣4
) 和 6 6 6
(3 ∣ 6 3|6 3∣6
) 作为虚拟蛤。根据我们上面的规定:
2 , 10 2, \ 10 2 , 10
被步长为 2 2 2
的蛤占据,和为 2 × ( 1 + 5 ) 2 \times (1 + 5) 2 × ( 1 + 5 )
;
3 , 9 3, \ 9 3 , 9
被步长为 3 3 3
的蛤占据,和为 3 × ( 1 + 3 ) 3 \times (1 + 3) 3 × ( 1 + 3 )
;
4 , 8 4, \ 8 4 , 8
被步长为 4 4 4
的蛤占据,和为 4 × ( 1 + 2 ) 4 \times (1 + 2) 4 × ( 1 + 2 )
;
6 6 6
被步长为 6 6 6
的蛤占据,和为 6 × 1 6 \times 1 6 × 1
。
不难发现,只有引入虚拟蛤我们才能不遗漏地将石头分配下去,并巧妙地避免重复从而计算出答案。
实现
欧拉函数貌似预处理的话存不下…… 那就 O ( N ) \mathcal{O}(\sqrt{N}) O ( N )
暴力算吧。
完整参考代码
容斥做法
分析
虽然容斥是很容易想到的方向,但是暴力容斥显然是不可行的,2 10 4 2^{10^4} 2 1 0 4
了解一下(逃……
那怎么办?可以考虑往贡献值的方向去思考……
我们不难注意到在计算步长为 l l l
的蛤时,我们重复地算了本该在计算 2 l , 3 l , … m l ⋅ l 2l, 3l, \dots \frac{m}{l} \cdot l 2 l , 3 l , … l m ⋅ l
等步长蛤时加入的值。我们不妨考虑给步长为 l l l
的蛤的答案乘上一个系数贡献值,初始时显然为 1 1 1
。那么在这种情况下,我们只需要对 2 l , 3 l , … m l ⋅ l 2l, 3l, \dots \frac{m}{l} \cdot l 2 l , 3 l , … l m ⋅ l
步长蛤的答案的贡献值减去步长为 l l l
的蛤的答案的贡献值即可达到去重的效果(如果不好理解建议参照例子)。
例子
我们依然以第一组样例举一个例子:
2 12
9 10
对于第一只蛤,其等效步长为 gcd ( 9 , 12 ) = 3 \gcd(9, 12) = 3 g cd( 9 , 12 ) = 3
,因此它可以跳到的石头有:0 , 3 , 6 , 9 0, \ 3, \ 6, \ 9 0 , 3 , 6 , 9
。
对于第二只蛤,其等效步长为 gcd ( 10 , 12 ) = 2 \gcd(10, 12) = 2 g cd( 10 , 12 ) = 2
,因此它可以跳到的石头有:0 , 2 , 4 , 6 , 8 , 10 0, \ 2, \ 4, \ 6, \ 8, \ 10 0 , 2 , 4 , 6 , 8 , 10
。
我们预处理出 12 12 12
所有小于自身的约数:1 , 2 , 3 , 4 , 6 1, \ 2, \ 3, \ 4, \ 6 1 , 2 , 3 , 4 , 6
。除去现有的 2 , 3 2, \ 3 2 , 3
,其中 4 4 4
和 6 6 6
都是现有步长之一的倍数,所以加进来是并不影响答案的,同时我们容斥的时候用得上。对于 2 , 3 , 4 , 6 2, \ 3, \ 4,\ 6 2 , 3 , 4 , 6
答案的贡献值我们都初始化为 1 1 1
。
步长为 2 2 2
的答案贡献值为 1 1 1
,由于计算 2 2 2
时等于重复计算了本该在 4 , 6 4, \ 6 4 , 6
处计算的值,所以 4 , 6 4, \ 6 4 , 6
的贡献值要减去 2 2 2
的贡献值,也就是 1 1 1
。由此一来,4 4 4
和 6 6 6
的贡献值都变成 0 0 0
了。答案增加了 1 × ( 2 + 4 + 6 + 8 + 10 ) 1 \times (2 + 4 + 6 + 8 + 10) 1 × ( 2 + 4 + 6 + 8 + 10 )
;
步长为 3 3 3
的答案贡献值为 1 1 1
,同理 6 6 6
的贡献值要减去 1 1 1
。答案增加了 1 × ( 3 + 6 + 9 ) 1 \times (3 + 6 + 9) 1 × ( 3 + 6 + 9 )
;
步长为 4 4 4
的答案贡献值为 0 0 0
。答案增加了 0 0 0
;
步长为 6 6 6
的答案贡献值为 − 1 -1 − 1
,答案减少了 1 × 6 1 \times 6 1 × 6
。
可以看到我们用贡献值的思想完美地容斥掉了多算的 6 6 6
。
实现
对于 10 9 10^9 1 0 9
级别的数因数个数大致是 10 9 \sqrt{10^9} 1 0 9
级别的,所以放心搞吧(逃
完整参考代码
%%%