加农炮 [Pick's Theorem][Farey Sequence][Stern-Brocot Tree][类欧]

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,0a,bn} 元素从小到大排列。
性质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 bcad=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=0ncai+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=0ncai+bi
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=0ncai+b2


推f
a ≥ c    o r    b ≥ c a\ge c\;or\;b\ge c acorbc 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)=ca2n(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)=nmf(c,cb1,a,m1)
具体过程
推的时候注意一些细节,比如小于等于变成小于的时间啦/之类的


推g
a ≥ c    o r    b ≥ c a\ge c\;or\;b\ge c acorbc 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)=ca6n(n+1)(2n+1)+cb2n(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 &lt; i ] \begin{array}{rcl} g(a,b,c,n)&amp;=&amp;\sum\limits_{i=0}^n\left\lfloor\frac{ai+b}{c}\cdot i\right\rfloor\\ &amp;=&amp;\sum\limits_{i=0}^ni\sum\limits_{j=0}^{m-1}[j+1\le\frac{ai+b}{c}]\\ &amp;=&amp;\sum\limits_{i=0}^ni\sum\limits_{j=0}^{m-1}[\frac{cj+c-b-1}{a}&lt; i] \end{array} g(a,b,c,n)===i=0ncai+bii=0nij=0m1[j+1cai+b]i=0nij=0m1[acj+cb1<i]
考虑对于每个 j j j ,在各个 i i i 处的取值组成一个等差数列。
a 1 = ⌊ c j + c − b − 1 a ⌋ + 1 &ThickSpace; , &ThickSpace; 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+cb1+1,anacj+cb1=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)&amp;=&amp;\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)\\ &amp;=&amp;\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\\ &amp;=&amp;\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=0m1(acj+cb1+1+n)(nacj+cb1)21j=0m1n(n+1)acj+cb1acj+cb1221n(n+1)mf(c,cb1,a,m1)h(c,cb1,a,m1)
震惊 g要先推h


推h
a ≥ c &ThickSpace; o r &ThickSpace; b ≥ c &ThickSpace; , &ThickSpace; a\ge c\;or\;b\ge c\;,\; acorbc,
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)&amp;=&amp;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\\\\ &amp;&amp;+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)ca2+(n+1)cb2+2cbf(a%c,b%c,c,n)+cacbn(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)&amp;=&amp;\sum\limits_{i=0}^n\left\lfloor\frac{ai+b}{c}\right\rfloor^2\\ &amp;=&amp;\sum\limits_{i=0}^n\sum\limits\\ \end{array} h(a,b,c,n)==i=0ncai+b2i=0n
啊?
考虑怎么把 ⌊ a i + b c ⌋ 2 \left\lfloor\frac{ai+b}{c}\right\rfloor^2 cai+b2 拆出来。
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=22x(x+1)x=(2i=1xi)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 &lt; 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)&amp;=&amp;\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\\ &amp;=&amp;\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\\ &amp;=&amp;\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)\\ &amp;=&amp;\left[2\sum\limits_{i=0}^n\sum\limits_{j=0}^{m-1}(j+1)\cdot\left[\frac{cj+c-b-1}{a}&lt;i\right]\right]-f(a,b,c,n)\\ &amp;=&amp;\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)\\ &amp;=&amp;\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)\\ &amp;=&amp;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=0nj=1cai+bjcai+b2i=0nj=1cai+bji=0ncai+b(2i=0nj=1mj[jcai+b])f(a,b,c,n)[2i=0nj=0m1(j+1)[acj+cb1<i]]f(a,b,c,n)[2j=0m1(j+1)(nacj+cb1)]f(a,b,c,n)[2j=0m1(j+1)n(j+1)acj+cb1]f(a,b,c,n)m(m+1)n2g(c,cb1,a,m1)2f(c,cb1,a,m1)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 &lt; n , 0 ≤ y &lt; m 0\le x&lt;n,0\le y&lt;m 0x<n,0y<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)

倍增杀了我
鸽了啊

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值