类欧几里得的基本操作

刚刚偷师学来了一波类欧,现在手推一下。

有几何推法——哦对不起空间想象能力超差的,这里直接用公式推导:

定义一堆东东

  • f(a,b,c,n)=ni=0ai+bc f ( a , b , c , n ) = ∑ i = 0 n ⌊ a i + b c ⌋
  • g(a,b,c,n)=ni=0iai+bc g ( a , b , c , n ) = ∑ i = 0 n i ⌊ a i + b c ⌋
  • h(a,b,c,n)=ni=0ai+bc2 h ( a , b , c , n ) = ∑ i = 0 n ⌊ a i + b c ⌋ 2

推导

对于a,b,c,n设 m=an+bc  ,a=amodc  ,b=bmodc m = ⌊ a n + b c ⌋     , a ′ = a mod c     , b ′ = b mod c

推f

f(a,b,c,n)=i=0nai+bc=i=0nai+bc+iac+bc=f(a,b,c,n)+12(n+1)nac+(n+1)bc(1)(2)(3) (1) f ( a , b , c , n ) = ∑ i = 0 n ⌊ a i + b c ⌋ (2) = ∑ i = 0 n ⌊ a ′ i + b ′ c ⌋ + i ⌊ a c ⌋ + ⌊ b c ⌋ (3) = f ( a ′ , b ′ , c , n ) + 1 2 ( n + 1 ) n ⌊ a c ⌋ + ( n + 1 ) ⌊ b c ⌋

对于 a<c,b<c a < c , b < c

f(a,b,c,n)=i=0nj=1m[jai+bc]=j=0m1i=0n[ai+bcj+1]=j=0m1i=0n[aijc+cb]=j=0m1i=0n[ai>jc+cb1]=j=0m1njc+cb1a=mnf(c,cb1,a,m1)(4)(5)(6)(7)(8)(9) (4) f ( a , b , c , n ) = ∑ i = 0 n ∑ j = 1 m [ j ≤ ⌊ a i + b c ⌋ ] (5) = ∑ j = 0 m − 1 ∑ i = 0 n [ ⌊ a i + b c ⌋ ≥ j + 1 ] (6) = ∑ j = 0 m − 1 ∑ i = 0 n [ a i ≥ j c + c − b ] (7) = ∑ j = 0 m − 1 ∑ i = 0 n [ a i > j c + c − b − 1 ] (8) = ∑ j = 0 m − 1 n − ⌊ j c + c − b − 1 a ⌋ (9) = m n − f ( c , c − b − 1 , a , m − 1 )

推g和h是类似的:

推g

g(a,b,c,n)=i=0niai+bc=i=0niai+bc+i2ac+ibc=g(a,b,c,n)+16n(n+1)(2n+1)ac+12(n+1)nbc(29)(30)(31) (29) g ( a , b , c , n ) = ∑ i = 0 n i ⌊ a i + b c ⌋ (30) = ∑ i = 0 n i ⌊ a ′ i + b ′ c ⌋ + i 2 ⌊ a c ⌋ + i ⌊ b c ⌋ (31) = g ( a ′ , b ′ , c , n ) + 1 6 n ( n + 1 ) ( 2 n + 1 ) ⌊ a c ⌋ + 1 2 ( n + 1 ) n ⌊ b c ⌋

a<c,b<c a < c , b < c

g(a,b,c,n)=i=0niai+bc=i=0nij=1m[jai+bc]=j=0m1i=0ni[i>jc+cb1a]=j=0m112n(n+1)12jc+cb1a(jc+cb1a+1)()=12(mn(n+1)h(c,cb1,a,m1)f(c,cb1,a,m1))(32)(33)(34)(35)(36)(37) (32) g ( a , b , c , n ) = ∑ i = 0 n i ⌊ a i + b c ⌋ (33) = ∑ i = 0 n i ∑ j = 1 m [ j ≤ ⌊ a i + b c ⌋ ] (34) = ∑ j = 0 m − 1 ∑ i = 0 n i [ i > ⌊ j c + c − b − 1 a ⌋ ] (35) = ∑ j = 0 m − 1 1 2 n ( n + 1 ) − 1 2 ⌊ j c + c − b − 1 a ⌋ ( ⌊ j c + c − b − 1 a ⌋ + 1 ) (36) ( 利 用 等 差 数 列 ) (37) = 1 2 ( m n ( n + 1 ) − h ( c , c − b − 1 , a , m − 1 ) − f ( c , c − b − 1 , a , m − 1 ) )

推h

h(a,b,c,n)=i=0nai+bc2=i=0n(ai+bc+iac+bc)2=i=0nai+bc2+i2ac2+bc2+2iai+bcac+2ai+bcbc+2iacbc=h(a,b,c,n)+16n(n+1)(2n+1)ac2+(n+1)bc2+2acg(a,b,c,n)+2bcf(a,b,c,n)+n(n+1)acbc(19)(20)(21)(22)(23) (19) h ( a , b , c , n ) = ∑ i = 0 n ⌊ a i + b c ⌋ 2 (20) = ∑ i = 0 n ( ⌊ a ′ i + b ′ c ⌋ + i ⌊ a c ⌋ + ⌊ b c ⌋ ) 2 (21) = ∑ i = 0 n ⌊ a ′ i + b ′ c ⌋ 2 + i 2 ⌊ a c ⌋ 2 + ⌊ b c ⌋ 2 + 2 i ⌊ a ′ i + b ′ c ⌋ ⌊ a c ⌋ + 2 ⌊ a ′ i + b ′ c ⌋ ⌊ b c ⌋ + 2 i ⌊ a c ⌋ ⌊ b c ⌋ (22) = h ( a ′ , b ′ , c , n ) + 1 6 n ( n + 1 ) ( 2 n + 1 ) ⌊ a c ⌋ 2 + ( n + 1 ) ⌊ b c ⌋ 2 + 2 ⌊ a c ⌋ g ( a ′ , b ′ , c , n ) (23) + 2 ⌊ b c ⌋ f ( a ′ , b ′ , c , n ) + n ( n + 1 ) ⌊ a c ⌋ ⌊ b c ⌋

a<c,b<c a < c , b < c

首先介绍个很有用的东西:

a2=(a+1)aa=2(i=1ai)a a 2 = ( a + 1 ) a − a = 2 ( ∑ i = 1 a i ) − a

那么

h(a,b,c,n)=i=0nai+bc2=i=0n2(j=1ai+bcj)ai+bc=2(j=0m1(j+1)i=0n[ai+bc>=j+1])f(a,b,c,n)=2(j=0m1ji=0n[i<jc+cb1a])+2(j=0m1i=0n[i<jc+cb1a])f(a,b,c,n)=2g(c,cb1,a,m1)+2f(c,cb1,a,m1)f(a,b,c,n)(24)(25)(26)(27)(28) (24) h ( a , b , c , n ) = ∑ i = 0 n ⌊ a i + b c ⌋ 2 (25) = ∑ i = 0 n 2 ( ∑ j = 1 ⌊ a i + b c ⌋ j ) − ⌊ a i + b c ⌋ (26) = 2 ( ∑ j = 0 m − 1 ( j + 1 ) ∑ i = 0 n [ ⌊ a i + b c ⌋ >= j + 1 ] ) − f ( a , b , c , n ) (27) = 2 ( ∑ j = 0 m − 1 j ∑ i = 0 n [ i < ⌊ j c + c − b − 1 a ⌋ ] ) + 2 ( ∑ j = 0 m − 1 ∑ i = 0 n [ i < ⌊ j c + c − b − 1 a ⌋ ] ) − f ( a , b , c , n ) (28) = 2 g ( c , c − b − 1 , a , m − 1 ) + 2 f ( c , c − b − 1 , a , m − 1 ) − f ( a , b , c , n )

递归求出a,b,c,n的f,g,h即可

时间复杂度

观察式子,发现a先模c,然后与c交换,在模,与gcd操作基本相同,时间复杂度也相同,为 O(loga) O ( log ⁡ a )

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值