本文将介绍下取整常用处理方法。不细讲。
整除分块
对于式子 ∑ i ⌊ a i ⌋ \sum\limits_{i}\left\lfloor\dfrac{a}{i}\right\rfloor i∑⌊ia⌋,是一系列分数取整求和,其中分母是求和枚举变量。此时就可以使用整除分块。时间复杂度 O ( n ) O(\sqrt n) O(n)。(一维整除分块)
原理是 ⌊ n i ⌋ \left\lfloor\dfrac{n}{i}\right\rfloor ⌊in⌋ 最多只有 2 n 2\sqrt n 2n 个取值。
对于式子 ∑ i ∑ j ⌊ a i ⌋ ⌊ b i ⌋ \sum\limits_{i}\sum\limits_{j}\left\lfloor\dfrac{a}{i}\right\rfloor\left\lfloor\dfrac{b}{i}\right\rfloor i∑j∑⌊ia⌋⌊ib⌋,使用二维整除分块。相当于两个下取整的断点只有 4 n 4\sqrt n 4n 个,时间复杂度为 O ( n ) O(\sqrt n) O(n)。实际上可以推广到 m m m 维整除分块,时间复杂度为 O ( m n ) O(m\sqrt n) O(mn)。
还有式子 ∑ i ⌊ n a i + b ⌋ \sum\limits_{i}\left\lfloor\dfrac{n}{ai+b}\right\rfloor i∑⌊ai+bn⌋,此时也可使用整除分块。
例题1
P2260 [清华集训2012] 模积和
求
∑ i = 1 n ∑ j = 1 m ( n m o d i ) × ( m m o d j ) , i ≠ j \sum_{i=1}^{n} \sum_{j=1}^{m} (n \bmod i) \times (m \bmod j), i \neq j i=1∑nj=1∑m(nmodi)×(mmodj),i=j
m o d 19940417 \mod 19940417 mod19940417 的值。
这里有一个常用技巧: a % b = a − b ⌊ a b ⌋ a\%b=a-b\left\lfloor\dfrac{a}{b}\right\rfloor a%b=a−b⌊ba⌋
这里把式子变成
( ∑ i = 1 n ( n − i ⌊ n i ⌋ ) ( ∑ j = 1 m ( m − i ⌊ m i ⌋ ) ) \left(\sum_{i=1}^{n}(n-i\left\lfloor\dfrac{n}{i}\right\rfloor\right)\left( \sum_{j=1}^{m} (m-i\left\lfloor\dfrac{m}{i}\right\rfloor)\right) (i=1∑n(n−i⌊in⌋)(j=1∑m(m−i⌊im⌋))
左右两边分别处理。
由于 n − i ⌊ n i ⌋ n-i\left\lfloor\dfrac{n}{i}\right\rfloor n−i⌊in⌋ 中有下取整,且分母是 i i i,所以可以使用整除分块。时间复杂度 O ( n ) O(\sqrt n) O(n)
一些恒等式
下面给出几个下取整恒等式。
- 若 gcd ( a , b ) = 1 \gcd(a,b)=1 gcd(a,b)=1,则有 2 ∑ i = 0 b − 1 ⌊ i a b ⌋ = ( a − 1 ) ( b − 1 ) 2\sum\limits_{i=0}^{b-1}\left\lfloor\dfrac{ia}{b}\right\rfloor=(a-1)(b-1) 2i=0∑b−1⌊bia⌋=(a−1)(b−1)
- 对于正整数 n , m , a , b ( a > b ) n,m,a,b(a>b) n,m,a,b(a>b),有 ∑ i = 0 m − 1 ⌊ n + i a + b m a ⌋ = ⌊ n + b a ⌋ \sum\limits_{i=0}^{m-1}\left\lfloor\dfrac{n+ia+b}{ma}\right\rfloor=\left\lfloor\dfrac{n+b}{a}\right\rfloor i=0∑m−1⌊man+ia+b⌋=⌊an+b⌋
- 对于 x ∈ R , n ∈ N + x\in\R,n\in\N^+ x∈R,n∈N+,有 ∑ i = 0 n − 1 ⌊ x + i n ⌋ = ⌊ n x ⌋ \sum\limits_{i=0}^{n-1}\left\lfloor x+\dfrac{i}{n}\right\rfloor=\left\lfloor nx\right\rfloor i=0∑n−1⌊x+ni⌋=⌊nx⌋
例题2
∑ i = 1 b ∑ j = 1 b ⌊ i j a b ⌋ \sum\limits_{i=1}^b\sum\limits_{j=1}^b\lfloor\dfrac{ija}{b}\rfloor i=1∑bj=1∑b⌊bija⌋
其中 b ∣ n , b ∣ m b\mid n,b\mid m b∣n,b∣m
T T T 组数据
答案 m o d 998244353 \bmod\space998244353 mod 998244353
我们先看如何求 ∑ i = 1 n ⌊ i a b ⌋ \sum\limits_{i=1}^n\lfloor\dfrac{ia}{b}\rfloor i=1∑n⌊bia⌋,其中 b ∣ n b\mid n b∣n
首先求 g = gcd ( a , b ) g=\gcd(a,b) g=gcd(a,b),原式化为 ∑ i = 1 n ⌊ i a ′ b ′ ⌋ \sum\limits_{i=1}^n\lfloor\dfrac{ia'}{b'}\rfloor i=1∑n⌊b′ia′⌋,其中 a ′ = a g , b ′ = b g a'=\dfrac ag,b'=\dfrac bg a′=ga,b′=gb。
因为 b ∣ n b\mid n b∣n,所以 ∑ i = 1 n ⌊ i a ′ b ′ ⌋ = ∑ j = 0 n b ′ − 1 ∑ i = 1 b ′ ⌊ a ′ ( i + j b ′ ) b ′ ⌋ = ∑ j = 0 n b ′ − 1 ∑ i = 1 b ′ ( ⌊ i a ′ b ′ ⌋ + j a ′ ) = n a ′ ( n − b ′ ) 2 b ′ + n b ′ ∑ i = 1 b ′ ⌊ i a ′ b ′ ⌋ \sum\limits_{i=1}^n\lfloor\dfrac{ia'}{b'}\rfloor=\sum\limits_{j=0}^{\frac n{b'}-1}\sum\limits_{i=1}^{b'}\lfloor \dfrac{a'(i+jb')}{b'}\rfloor=\sum\limits_{j=0}^{\frac n{b'}-1}\sum\limits_{i=1}^{b'}\left(\lfloor\dfrac{ia'}{b'}\rfloor+ja'\right)=\dfrac{na'\left(n-b'\right)}{2b'}+\dfrac{n}{b'}\sum\limits_{i=1}^{b'}\lfloor\dfrac{ia'}{b'}\rfloor i=1∑n⌊b′ia′⌋=j=0∑b′n−1i=1∑b′⌊b′a′(i+jb′)⌋=j=0∑b′n−1i=1∑b′(⌊b′ia′⌋+ja′)=2b′na′(n−b′)+b′ni=1∑b′⌊b′ia′⌋
问题转为求 ∑ i = 1 b ′ ⌊ i a ′ b ′ ⌋ \sum\limits_{i=1}^{b'}\lfloor\dfrac{ia'}{b'}\rfloor i=1∑b′⌊b′ia′⌋
由结论 1 1 1 得 ∑ i = 1 b ′ ⌊ i a ′ b ′ ⌋ = ( a ′ − 1 ) ( b ′ − 1 ) 2 + a ′ \sum\limits_{i=1}^{b'}\lfloor\dfrac{ia'}{b'}\rfloor=\dfrac{(a'-1)(b'-1)}{2}+a' i=1∑b′⌊b′ia′⌋=2(a′−1)(b′−1)+a′
∑ i = 1 n ⌊ i a b ⌋ = n a ′ ( n − b ′ ) 2 b ′ + n b ′ ( a ′ ( b ′ + 1 ) 2 − b ′ − 1 2 ) = n ( a ′ n + a ′ − b ′ + 1 ) 2 b ′ = n ( a n + a − b + gcd ( a , b ) ) 2 b \sum\limits_{i=1}^n\lfloor\dfrac{ia}{b}\rfloor=\dfrac{na'\left(n-b'\right)}{2b'}+\dfrac{n}{b'}\left(\dfrac{a'(b'+1)}{2}-\dfrac{b'-1}{2}\right)=\dfrac{n\left(a'n+a'-b'+1\right)}{2b'}=\dfrac{n\left(an+a-b+\gcd(a,b)\right)}{2b} i=1∑n⌊bia⌋=2b′na′(n−b′)+b′n(2a′(b′+1)−2b′−1)=2b′n(a′n+a′−b′+1)=2bn(an+a−b+gcd(a,b))
看回原题
∑ i = 1 n ∑ j = 1 m ⌊ i j a b ⌋ = ∑ i = 1 n m ( i a m + i a − b + gcd ( i a , b ) ) 2 b = − m n 2 + m n a ( m + 1 ) ( n + 1 ) 4 b + m 2 b ∑ i = 1 n gcd ( i a , b ) \sum\limits_{i=1}^n\sum\limits_{j=1}^m\lfloor\dfrac{ija}{b}\rfloor=\sum\limits_{i=1}^n\dfrac{m\left(iam+ia-b+\gcd(ia,b)\right)}{2b}=-\dfrac{mn}{2}+\dfrac{mna\left(m+1\right)\left(n+1\right)}{4b}+\dfrac{m}{2b}\sum\limits_{i=1}^n\gcd(ia,b) i=1∑nj=1∑m⌊bija⌋=i=1∑n2bm(iam+ia−b+gcd(ia,b))=−2mn+4bmna(m+1)(n+1)+2bmi=1∑ngcd(ia,b)
易得 ∑ i = 1 n gcd ( i a , b ) = g ∑ i = 1 n gcd ( i a ′ , b ′ ) = g ∑ i = 1 n gcd ( i , b ′ ) \sum\limits_{i=1}^n\gcd(ia,b)=g\sum\limits_{i=1}^n\gcd(ia',b')=g\sum\limits_{i=1}^n\gcd(i,b') i=1∑ngcd(ia,b)=gi=1∑ngcd(ia′,b′)=gi=1∑ngcd(i,b′)
同时 ∑ i = 1 n gcd ( i , b ′ ) = n b ′ ∑ i = 1 b ′ gcd ( i , b ′ ) \sum\limits_{i=1}^n\gcd(i,b')=\dfrac{n}{b'}\sum\limits_{i=1}^{b'}\gcd(i,b') i=1∑ngcd(i,b′)=b′ni=1∑b′gcd(i,b′),因为 gcd ( i , b ′ ) = gcd ( i + b ′ , b ′ ) \gcd(i,b')=\gcd(i+b',b') gcd(i,b′)=gcd(i+b′,b′)
∑ i = 1 b ′ gcd ( i , b ′ ) = ∑ d ∣ b ′ d ∑ i = 1 b ′ [ gcd ( i , b ′ ) = d ] = ∑ d ∣ b ′ d ∑ i = 1 b ′ d [ gcd ( i , b ′ d ) = 1 ] = ∑ d ∣ b ′ d φ ( b ′ d ) = ∑ d ∣ b ′ φ ( d ) b ′ d \sum\limits_{i=1}^{b'}\gcd(i,b')=\sum\limits_{d\mid b'}d\sum\limits_{i=1}^{b'}[\gcd(i,b')=d]=\sum\limits_{d\mid b'}d\sum\limits_{i=1}^{\frac{b'}{d}}[\gcd(i,\frac{b'}{d})=1]=\sum\limits_{d\mid b'}d\varphi(\frac{b'}{d})=\sum\limits_{d\mid b'}\varphi(d)\frac{b'}{d} i=1∑b′gcd(i,b′)=d∣b′∑di=1∑b′[gcd(i,b′)=d]=d∣b′∑di=1∑db′[gcd(i,db′)=1]=d∣b′∑dφ(db′)=d∣b′∑φ(d)db′
显然 f ( x ) = ∑ d ∣ x φ ( d ) x d f(x)=\sum\limits_{d\mid x}\varphi(d)\frac{x}{d} f(x)=d∣x∑φ(d)dx 可以 O ( x ) O(\sqrt x) O(x) 求出单点值。
最终答案为 = m n 4 b 2 ⋅ ( a b ( m + 1 ) ( n + 1 ) − 2 b 2 + 2 g 2 f ( b g ) ) =\dfrac{mn}{4b^2}\cdot\left(ab\left(m+1\right)\left(n+1\right)-2b^2+2g^2f(\frac{b}{g})\right) =4b2mn⋅(ab(m+1)(n+1)−2b2+2g2f(gb))
总的时间复杂度为 O ( T b ) O(T\sqrt b) O(Tb)
例题3
定义 f ( n ) = ∑ i = 1 n ⌊ n i ⌋ f(n)=\sum\limits_{i=1}^n\left\lfloor\dfrac{n}{i}\right\rfloor f(n)=i=1∑n⌊in⌋,特殊的, f ( 0 ) = 0 f(0)=0 f(0)=0
给出 m m m,你需要给出长度为 n n n 的自然数数列,使 ∑ i = 1 n ( f ( a i + 1 ) − f ( a i ) ) = m \sum\limits_{i=1}^n(f(a_i+1)-f(a_i))=m i=1∑n(f(ai+1)−f(ai))=m
采用 SPJ \text{SPJ} SPJ 评测。
1 ≤ n ≤ 20 , 0 ≤ a i < 2 63 , 1 ≤ m ≤ 2 × 1 0 5 1\le n\le20,0\le a_i<2^{63},1\le m\le2\times10^5 1≤n≤20,0≤ai<263,1≤m≤2×105
这题不用什么技巧,直接爆算。
f ( n + 1 ) − f ( n ) = ∑ i = 1 n + 1 ⌊ n + 1 i ⌋ − ∑ i = 1 n ⌊ n i ⌋ = 1 + ∑ i = 1 n ( ⌊ n + 1 i ⌋ − ⌊ n i ⌋ ) = ∑ i = 1 n + 1 1 + n % i − ( n + 1 ) % i i \begin{aligned} f(n+1)-f(n)&=\sum\limits_{i=1}^{n+1}\left\lfloor\dfrac{n+1}{i}\right\rfloor-\sum\limits_{i=1}^n\left\lfloor\dfrac{n}{i}\right\rfloor\\ &=1+\sum\limits_{i=1}^{n}\left(\left\lfloor\dfrac{n+1}{i}\right\rfloor-\left\lfloor\dfrac{n}{i}\right\rfloor\right)\\ &=\sum\limits_{i=1}^{n+1}\dfrac{1+n\%i-(n+1)\%i}{i}\\ \end{aligned} f(n+1)−f(n)=i=1∑n+1⌊in+1⌋−i=1∑n⌊in⌋=1+i=1∑n(⌊in+1⌋−⌊in⌋)=i=1∑n+1i1+n%i−(n+1)%i
显然当 i i i 是 n + 1 n+1 n+1 的因数时, 1 + n % i − ( n + 1 ) % i 1+n\%i-(n+1)\%i 1+n%i−(n+1)%i 等于 1 1 1,否则为 0 0 0。
即 f ( n + 1 ) − f ( n ) = σ 0 ( n + 1 ) f(n+1)-f(n)=\sigma_0(n+1) f(n+1)−f(n)=σ0(n+1)
观察到 1 ≤ n ≤ 20 , 1 ≤ m ≤ 2 × 1 0 5 1\le n\le20,1\le m\le2\times 10^5 1≤n≤20,1≤m≤2×105,容易想到构造出一些 n n n 满足 f ( n + 1 ) − f ( n ) = 2 0 , 2 1 , … , 2 17 f(n+1)-f(n)=2^0,2^1,\dots,2^{17} f(n+1)−f(n)=20,21,…,217
我们都知道 σ 0 ( n ) = ∏ i = 1 m ( c i + 1 ) \sigma_0(n)=\prod\limits_{i=1}^m(c_i+1) σ0(n)=i=1∏m(ci+1),其中 n = p 1 c 1 p 2 c 2 … p m c m n=p_1^{c_1}p_2^{c_2}\dots p_{m}^{c_m} n=p1c1p2c2…pmcm
只需令 n n n 为前几个质数的乘积,即可构造出 σ 0 ( n ) \sigma_0(n) σ0(n) 为 2 2 2 的幂。
注意 n n n 要在 long long \text{long long} long long 范围内,而 2 × 3 × 5 × ⋯ × 47 2\times 3\times5\times \dots\times47 2×3×5×⋯×47(共 15 15 15 个质数)已经是极限,所以可以放弃后面的大质数,给前面的 2 , 3 2,3 2,3 加次数。这样可以构造出 2 16 , 2 17 2^{16},2^{17} 216,217。
类欧几里得
这三个式子 ∑ i = 0 n ⌊ a i + b c ⌋ , ∑ i = 0 n ⌊ a i + b c ⌋ 2 , ∑ i = 0 n i ⌊ a i + b c ⌋ \sum\limits_{i=0}^{n}\lfloor \frac{ai+b}{c} \rfloor\,,\ \sum\limits_{i=0}^{n}{\lfloor \frac{ai+b}{c} \rfloor}^2\,,\ \sum\limits_{i=0}^{n}i\lfloor \frac{ai+b}{c} \rfloor i=0∑n⌊cai+b⌋, i=0∑n⌊cai+b⌋2, i=0∑ni⌊cai+b⌋
都可以用类欧几里得求。时间复杂度均为 O ( n ) O(\sqrt n) O(n)。(分母为常数,分子是一次形式)
例题4
CF1182F 改编
给出整数 l , r l,r l,r 和奇数 a , k a,k a,k,求当 min x ∈ [ l , r ] ∩ Z tan ( a k π x ) \min\limits_{x\in[l,r]\cap\Z}\tan\left(\dfrac{a}{k}\pi x\right) x∈[l,r]∩Zmintan(kaπx) 取得最小值时的最小整数 x x x。
题解参考 CF1182F
进制转换
形如 ⌊ A a b ⌋ \left\lfloor\dfrac{A}{a^b}\right\rfloor ⌊abA⌋,分母中有指数, a b a^b ab 又特别大,可以考虑使用 FFT \text{FFT} FFT。
⌊ A a b ⌋ = A − A % a b a b \left\lfloor\dfrac{A}{a^b}\right\rfloor=\dfrac{A-A\%a^b}{a^b} ⌊abA⌋=abA−A%ab
联想到一个数 n n n 模 2 x 2^x 2x 相当于把 n n n 转换为二进制后取后面的 x x x 位。
所以求 A % a b A\%a^b A%ab 可以先把 A A A 转成 a a a 进制再进行运算。有时会有奇效。
例题5
from DengDuck
求 ⌊ a b c d ⌋ \left\lfloor\dfrac{a^b}{c^d}\right\rfloor ⌊cdab⌋
1 ≤ a , b ≤ 1 0 9 , 1 ≤ c ≤ 100 , 1 ≤ d ≤ 1 0 4 1\le a,b\le10^9,1\le c\le100,1\le d\le 10^4 1≤a,b≤109,1≤c≤100,1≤d≤104
答案模 998244353 998244353 998244353
将 a a a 转成 c c c 进制,然后将各位系数看作是一个多项式,然后做快速幂。其中多项式乘法用 F F T FFT FFT 快速算出。
时间复杂度 O ( d log d log b ) O(d\log d\log b) O(dlogdlogb)