Link
No Response
Pick’s Theorem
Reference
Farey Sequence
F
n
=
{
a
/
b
  
∣
  
(
a
,
b
)
=
1
  
,
  
0
≤
a
,
b
≤
n
}
F_n=\{a/b\;|\;(a,b)=1\;,\;0\le a,b\le n\}
Fn={a/b∣(a,b)=1,0≤a,b≤n} 元素从小到大排列。
性质1 除
F
1
F_1
F1 外的任意阶 Farey Sequence 都有奇数个元素,且位于中间的数是
1
/
2
1/2
1/2
性质2
F
n
F_n
Fn 关于中点对称的两项和为
1
1
1
[Important]性质3
F
n
[
x
]
=
a
/
b
  
,
  
F
n
[
x
+
1
]
=
c
/
d
  
,
  
F_n[x]=a/b\;,\;F_n[x+1]=c/d\;,\;
Fn[x]=a/b,Fn[x+1]=c/d, 则
b
c
−
a
d
=
1
bc-ad=1
bc−ad=1
*性质 Farey Sequence 中的数都是真分数。(无视
1
/
0
1/0
1/0)
显然地: F n F_n Fn 的大小是 2 n + 1 2^n+1 2n+1 (如果算上 1 / 0 1/0 1/0 )。
Stern-Brocot Tree
定义我就不讲啦。
从 F 1 F_1 F1 开始每次把相较上一阶 Farey Sequence 多出的数作为上一阶比上上阶多出的数的子结点,
且相对位置不变,就能构造出 Stern-Brocot Tree 。
这么讲可能有点啰嗦,简略讲就是:
在上面每两个相邻真分数
x
1
/
y
1
  
,
  
x
2
/
y
2
x_1/y_1\;,\;x_2/y_2
x1/y1,x2/y2 中间插入
(
x
1
+
x
2
)
/
(
y
1
+
y
2
)
(x_1+x_2)/(y_1+y_2)
(x1+x2)/(y1+y2) 就能构成下一层
(以上也适用于 farey sequence
然后把下一层的每个数跟上一层生成它的连边。
实际上, Farey Sequence 是 Stern-Brocot Tree 的衍生。
无视
0
/
1
0/1
0/1 和
1
/
0
1/0
1/0 ,Stern-Brocot Tree就是一棵满的完全二叉树。
类欧
f
(
a
,
b
,
c
,
n
)
=
∑
i
=
0
n
⌊
a
i
+
b
c
⌋
f(a,b,c,n)=\sum\limits_{i=0}^n\left\lfloor\frac{ai+b}{c}\right\rfloor
f(a,b,c,n)=i=0∑n⌊cai+b⌋
g
(
a
,
b
,
c
,
n
)
=
∑
i
=
0
n
⌊
a
i
+
b
c
⋅
i
⌋
g(a,b,c,n)=\sum\limits_{i=0}^n\left\lfloor\frac{ai+b}{c}\cdot i\right\rfloor
g(a,b,c,n)=i=0∑n⌊cai+b⋅i⌋
h
(
a
,
b
,
c
,
n
)
=
∑
i
=
0
n
⌊
a
i
+
b
c
⌋
2
h(a,b,c,n)=\sum\limits_{i=0}^n\left\lfloor\frac{ai+b}{c}\right\rfloor^2
h(a,b,c,n)=i=0∑n⌊cai+b⌋2
推f
a
≥
c
  
o
r
  
b
≥
c
a\ge c\;or\;b\ge c
a≥corb≥c ,
f
(
a
,
b
,
c
,
n
)
=
⌊
a
c
⌋
⋅
n
(
n
+
1
)
2
+
⌊
b
c
⌋
⋅
(
n
+
1
)
+
f
(
a
%
c
,
b
%
c
,
c
,
n
)
f(a,b,c,n)=\left\lfloor\frac{a}{c}\right\rfloor\cdot\frac{n(n+1)}{2}+\left\lfloor\frac{b}{c}\right\rfloor\cdot (n+1)+f(a\%c,b\%c,c,n)
f(a,b,c,n)=⌊ca⌋⋅2n(n+1)+⌊cb⌋⋅(n+1)+f(a%c,b%c,c,n)
o
t
h
e
r
w
i
s
e
  
,
  
f
(
a
,
b
,
c
,
n
)
=
n
m
−
f
(
c
,
c
−
b
−
1
,
a
,
m
−
1
)
otherwise\;,\;f(a,b,c,n)=nm-f(c,c-b-1,a,m-1)
otherwise,f(a,b,c,n)=nm−f(c,c−b−1,a,m−1)
具体过程
推的时候注意一些细节,比如小于等于变成小于的时间啦/之类的
推g
a
≥
c
  
o
r
  
b
≥
c
a\ge c\;or\;b\ge c
a≥corb≥c ,
g
(
a
,
b
,
c
,
n
)
=
⌊
a
c
⌋
⋅
n
(
n
+
1
)
(
2
n
+
1
)
6
+
⌊
b
c
⌋
⋅
n
(
n
+
1
)
2
+
g
(
a
%
c
,
b
%
c
,
c
,
n
)
g(a,b,c,n)=\left\lfloor\frac{a}{c}\right\rfloor\cdot\frac{n(n+1)(2n+1)}{6}+\left\lfloor\frac{b}{c}\right\rfloor\cdot\frac{n(n+1)}{2}+g(a\%c,b\%c,c,n)
g(a,b,c,n)=⌊ca⌋⋅6n(n+1)(2n+1)+⌊cb⌋⋅2n(n+1)+g(a%c,b%c,c,n)
o
t
h
e
r
w
i
s
e
,
otherwise,
otherwise,
g
(
a
,
b
,
c
,
n
)
=
∑
i
=
0
n
⌊
a
i
+
b
c
⋅
i
⌋
=
∑
i
=
0
n
i
∑
j
=
0
m
−
1
[
j
+
1
≤
a
i
+
b
c
]
=
∑
i
=
0
n
i
∑
j
=
0
m
−
1
[
c
j
+
c
−
b
−
1
a
<
i
]
\begin{array}{rcl} g(a,b,c,n)&=&\sum\limits_{i=0}^n\left\lfloor\frac{ai+b}{c}\cdot i\right\rfloor\\ &=&\sum\limits_{i=0}^ni\sum\limits_{j=0}^{m-1}[j+1\le\frac{ai+b}{c}]\\ &=&\sum\limits_{i=0}^ni\sum\limits_{j=0}^{m-1}[\frac{cj+c-b-1}{a}< i] \end{array}
g(a,b,c,n)===i=0∑n⌊cai+b⋅i⌋i=0∑nij=0∑m−1[j+1≤cai+b]i=0∑nij=0∑m−1[acj+c−b−1<i]
考虑对于每个
j
j
j ,在各个
i
i
i 处的取值组成一个等差数列。
a
1
=
⌊
c
j
+
c
−
b
−
1
a
⌋
+
1
  
,
  
a
n
−
⌊
c
j
+
c
−
b
−
1
a
⌋
=
n
a_1=\left\lfloor\frac{cj+c-b-1}{a}\right\rfloor+1\;,\;a_{n-\left\lfloor\frac{cj+c-b-1}{a}\right\rfloor}=n
a1=⌊acj+c−b−1⌋+1,an−⌊acj+c−b−1⌋=n
等差数列求和
(
a
1
+
a
n
)
⋅
n
2
\frac{(a_1+a_n)\cdot n}{2}
2(a1+an)⋅n
g
(
a
,
b
,
c
,
n
)
=
1
2
∑
j
=
0
m
−
1
(
⌊
c
j
+
c
−
b
−
1
a
⌋
+
1
+
n
)
(
n
−
⌊
c
j
+
c
−
b
−
1
a
⌋
)
=
1
2
∑
j
=
0
m
−
1
n
(
n
+
1
)
−
⌊
c
j
+
c
−
b
−
1
a
⌋
−
⌊
c
j
+
c
−
b
−
1
a
⌋
2
=
1
2
⋅
n
(
n
+
1
)
m
−
f
(
c
,
c
−
b
−
1
,
a
,
m
−
1
)
−
h
(
c
,
c
−
b
−
1
,
a
,
m
−
1
)
\begin{array}{rcl} g(a,b,c,n)&=&\frac{1}{2}\sum\limits_{j=0}^{m-1}\left(\left\lfloor\frac{cj+c-b-1}{a}\right\rfloor+1+n\right)\left(n-\left\lfloor\frac{cj+c-b-1}{a}\right\rfloor\right)\\ &=&\frac{1}{2}\sum\limits_{j=0}^{m-1}n(n+1)-\left\lfloor\frac{cj+c-b-1}{a}\right\rfloor-\left\lfloor\frac{cj+c-b-1}{a}\right\rfloor^2\\ &=&\frac{1}{2}\cdot n(n+1)m-f(c,c-b-1,a,m-1)-h(c,c-b-1,a,m-1)\\ \end{array}
g(a,b,c,n)===21j=0∑m−1(⌊acj+c−b−1⌋+1+n)(n−⌊acj+c−b−1⌋)21j=0∑m−1n(n+1)−⌊acj+c−b−1⌋−⌊acj+c−b−1⌋221⋅n(n+1)m−f(c,c−b−1,a,m−1)−h(c,c−b−1,a,m−1)
震惊 g要先推h
推h
a
≥
c
  
o
r
  
b
≥
c
  
,
  
a\ge c\;or\;b\ge c\;,\;
a≥corb≥c,
h
(
a
,
b
,
c
,
n
)
=
h
(
a
%
c
,
b
%
c
,
c
,
n
)
+
n
(
n
+
1
)
(
2
n
+
1
)
6
⋅
⌊
a
c
⌋
2
+
(
n
+
1
)
⋅
⌊
b
c
⌋
2
+
2
⌊
b
c
⌋
f
(
a
%
c
,
b
%
c
,
c
,
n
)
+
⌊
a
c
⌋
⌊
b
c
⌋
n
(
n
+
1
)
\begin{array}{rcl} h(a,b,c,n)&=&h(a\%c,b\%c,c,n)+\frac{n(n+1)(2n+1)}{6}\cdot\left\lfloor\frac{a}{c}\right\rfloor^2+(n+1)\cdot\left\lfloor\frac{b}{c}\right\rfloor^2\\\\ &&+2\lfloor\frac{b}{c}\rfloor f(a\%c,b\%c,c,n)+\left\lfloor\frac{a}{c}\right\rfloor\left\lfloor\frac{b}{c}\right\rfloor n(n+1) \end{array}
h(a,b,c,n)=h(a%c,b%c,c,n)+6n(n+1)(2n+1)⋅⌊ca⌋2+(n+1)⋅⌊cb⌋2+2⌊cb⌋f(a%c,b%c,c,n)+⌊ca⌋⌊cb⌋n(n+1)
o
t
h
e
r
w
i
s
e
,
otherwise,
otherwise,
h
(
a
,
b
,
c
,
n
)
=
∑
i
=
0
n
⌊
a
i
+
b
c
⌋
2
=
∑
i
=
0
n
∑
\begin{array}{rcl} h(a,b,c,n)&=&\sum\limits_{i=0}^n\left\lfloor\frac{ai+b}{c}\right\rfloor^2\\ &=&\sum\limits_{i=0}^n\sum\limits\\ \end{array}
h(a,b,c,n)==i=0∑n⌊cai+b⌋2i=0∑n∑
啊?
考虑怎么把
⌊
a
i
+
b
c
⌋
2
\left\lfloor\frac{ai+b}{c}\right\rfloor^2
⌊cai+b⌋2 拆出来。
x
2
=
2
⋅
x
(
x
+
1
)
2
−
x
=
(
2
∑
i
=
1
x
i
)
−
n
x^2=2\cdot\frac{x(x+1)}{2}-x=\left(2\sum\limits_{i=1}^xi\right)-n
x2=2⋅2x(x+1)−x=(2i=1∑xi)−n
h ( a , b , c , n ) = [ 2 ∑ i = 0 n ( ∑ j = 1 ⌊ a i + b c ⌋ j ) ] − ⌊ a i + b c ⌋ = ( 2 ∑ i = 0 n ∑ j = 1 ⌊ a i + b c ⌋ j ) − ∑ i = 0 n ⌊ a i + b c ⌋ = ( 2 ∑ i = 0 n ∑ j = 1 m j ⋅ [ j ≤ ⌊ a i + b c ⌋ ] ) − f ( a , b , c , n ) = [ 2 ∑ i = 0 n ∑ j = 0 m − 1 ( j + 1 ) ⋅ [ c j + c − b − 1 a < i ] ] − f ( a , b , c , n ) = [ 2 ∑ j = 0 m − 1 ( j + 1 ) ( n − ⌊ c j + c − b − 1 a ⌋ ) ] − f ( a , b , c , n ) = [ 2 ∑ j = 0 m − 1 ( j + 1 ) n − ( j + 1 ) ⌊ c j + c − b − 1 a ⌋ ] − f ( a , b , c , n ) = m ( m + 1 ) n − 2 g ( c , c − b − 1 , a , m − 1 ) − 2 f ( c , c − b − 1 , a , m − 1 ) − f ( a , b , c , n ) \begin{array}{rcl} h(a,b,c,n)&=&\left[2\sum\limits_{i=0}^n\left(\sum\limits_{j=1}^{\left\lfloor\frac{ai+b}{c}\right\rfloor}j\right)\right]-\left\lfloor\frac{ai+b}{c}\right\rfloor\\ &=&\left(2\sum\limits_{i=0}^n\sum\limits_{j=1}^{\left\lfloor\frac{ai+b}{c}\right\rfloor}j\right)-\sum\limits_{i=0}^n\left\lfloor\frac{ai+b}{c}\right\rfloor\\ &=&\left(2\sum\limits_{i=0}^n\sum\limits_{j=1}^mj\cdot\left[j\le\left\lfloor\frac{ai+b}{c}\right\rfloor\right]\right)-f(a,b,c,n)\\ &=&\left[2\sum\limits_{i=0}^n\sum\limits_{j=0}^{m-1}(j+1)\cdot\left[\frac{cj+c-b-1}{a}<i\right]\right]-f(a,b,c,n)\\ &=&\left[2\sum\limits_{j=0}^{m-1}(j+1)\left(n-\left\lfloor\frac{cj+c-b-1}{a}\right\rfloor\right)\right]-f(a,b,c,n)\\ &=&\left[2\sum\limits_{j=0}^{m-1}(j+1)n-(j+1)\left\lfloor\frac{cj+c-b-1}{a}\right\rfloor\right]-f(a,b,c,n)\\ &=&m(m+1)n-2g(c,c-b-1,a,m-1)-2f(c,c-b-1,a,m-1)-f(a,b,c,n)\\ \end{array} h(a,b,c,n)=======⎣⎡2i=0∑n⎝⎛j=1∑⌊cai+b⌋j⎠⎞⎦⎤−⌊cai+b⌋⎝⎛2i=0∑nj=1∑⌊cai+b⌋j⎠⎞−i=0∑n⌊cai+b⌋(2i=0∑nj=1∑mj⋅[j≤⌊cai+b⌋])−f(a,b,c,n)[2i=0∑nj=0∑m−1(j+1)⋅[acj+c−b−1<i]]−f(a,b,c,n)[2j=0∑m−1(j+1)(n−⌊acj+c−b−1⌋)]−f(a,b,c,n)[2j=0∑m−1(j+1)n−(j+1)⌊acj+c−b−1⌋]−f(a,b,c,n)m(m+1)n−2g(c,c−b−1,a,m−1)−2f(c,c−b−1,a,m−1)−f(a,b,c,n)
回归正题,,,
很显然,如果人够多,所有目标都会被打掉。
我们暂且把整个坐标系往左下移动一格。
打到某一个目标
(
x
,
y
)
(x,y)
(x,y) 的话,旋转的角度是
arctan
(
x
/
y
)
\arctan(x/y)
arctan(x/y)
也就是说每一个真分数
x
/
y
x/y
x/y (
0
≤
x
<
n
,
0
≤
y
<
m
0\le x<n,0\le y<m
0≤x<n,0≤y<m , 包括
1
/
0
1/0
1/0 和
0
/
1
0/1
0/1) 对应一条射线的目标
并且这条射线的斜率是
x
/
y
x/y
x/y 。
构造 Farey Sequence 就可以得到(按照射线的)炮击顺序。
一条射线上有多少目标呢?相当于求射线
j
=
x
i
/
y
j=xi/y
j=xi/y 上的整点数目(不包含原点)。
为了方便显然可以特判掉
x
=
0
x=0
x=0 和
y
=
0
y=0
y=0 的情况。剩下的怎么求呢
显然是
min
{
n
x
,
m
y
}
\min\{\frac{n}{x},\frac{m}{y}\}
min{xn,ym}
。。。
剩下的问题就是 你看看这个数据范围
是不是有、大啊
至少对于每组询问要做到
O
(
log
)
O(\log)
O(log) 或者
O
(
sqrt
)
O(\operatorname{sqrt})
O(sqrt) 之类的
直接暴力预处理构造 Farey Sequence / Stern-Brocot Tree 都不现实。。
性质 Stern-Brocot Tree 上,分母为
n
n
n 的真分数到根节点的路径上的拐点数目不超过
log
n
\log n
logn 个
证明只需要考虑一个不停拐啊拐的路径 然后考虑利用
a
+
b
c
+
d
\frac{a+b}{c+d}
c+da+b 构造下一层的那个性质
而如果直接走下来的话,最多可能要走
O
(
n
)
O(n)
O(n)
给出一张 Stern-Brocot Tree 的图方便观察()图引 Wikipedia
这样的话在 Stern-Brocot Tree 上走路的时候拐点是
O
(
log
n
)
O(\log n)
O(logn) 的
在每个拐点处搞倍增。然后就变成了
O
(
log
2
n
)
O(\log^2 n)
O(log2n)
注意到我们只需要求出第
k
k
k 个人能够打到哪里,所以每组询问走一次即可。
但是二分的话前面的问题就变成了求射线某一边的整点数目。。用类欧判定,喜加一个
log
\log
log
O
(
T
log
3
n
)
O(T\log^3 n)
O(Tlog3n) 。
倍增杀了我
鸽了啊