1. 程式人生 > >BZOJ2987:Earthquake(類歐幾里德演算法)

BZOJ2987:Earthquake(類歐幾里德演算法)

Sol

n = c a n=\lfloor\frac{c}{a}\rfloor


問題轉化為求
i = 0 n
c a x b + 1
= i = 0 n a x + b + c b \sum_{i=0}^{n}\lfloor\frac{c-ax}{b}\rfloor+1=\sum_{i=0}^{n}\lfloor\frac{-ax+b+c}{b}\rfloor

考慮一般性的問題

f ( a , b , c , n ) = i = 0 n a x + b c c 0 f(a,b,c,n)=\sum_{i=0}^{n}\lfloor\frac{ax+b}{c}\rfloor,c\ne 0

  1. c 0 c\le 0 ,那麼 f ( a , b , c , n ) = f ( a , b , c , n ) f(a,b,c,n)=f(-a,-b,-c,n)
  2. a < 0 a<0 b < 0 b<0 ,那麼
    f ( a , b , c , n ) = f ( a   m o d   c + c , b   m o d   c + c , c , n ) + n ( n + 1 ) 2 ( a c 1 ) + ( n + 1 ) ( b c 1 ) f(a,b,c,n)=f(a~mod~c + c, b~mod~c + c, c, n) + \frac{n(n + 1)}{2} (\lfloor\frac{a}{c}\rfloor - 1) + (n + 1)(\lfloor\frac{b}{c}\rfloor - 1)
  3. a > = c a>=c b > = c b>=c ,那麼
    f ( a , b , c , n ) = f ( a   m o d   c , b   m o d   c , c , n ) + n ( n + 1 ) 2 a c + ( n + 1 ) b c f(a,b,c,n)=f(a~mod~c, b~mod~c, c, n) + \frac{n(n + 1)}{2}\lfloor\frac{a}{c}\rfloor + (n + 1)\lfloor\frac{b}{c}\rfloor
  4. 最後 0 a < c 0\le a<c 0 b < c 0\le b<c
    m = a n + b c m=\lfloor\frac{an+b}{c}\rfloor
    那麼
    i = 0 n a i + b c = i = 0 n j = 1 m [ a i + b c j ] = i = 0 n j = 0 m 1 [ a i + b c j + 1 ] \sum_{i=0}^{n}\lfloor\frac{ai+b}{c}\rfloor=\sum_{i=0}^{n}\sum_{j=1}^{m}[\lfloor\frac{ai+b}{c}\rfloor\ge j]=\sum_{i=0}^{n}\sum_{j=0}^{m-1}[\lfloor\frac{ai+b}{c}\rfloor\ge j+1]
    = i = 0 n j = 0 m 1 [ a i c j + c b ] = i = 0 n j = 0 m 1 [ a i > c j + c b 1 ] =\sum_{i=0}^{n}\sum_{j=0}^{m-1}[ai\ge cj+c-b]=\sum_{i=0}^{n}\sum_{j=0}^{m-1}[ai> cj+c-b-1]