整除分块入门

数论与线性代数——整除分块【数论分块】的【运用】&【思考】&【讲解】&【证明(作者自己证的QWQ)】 整除分块与数论分块的运用,思考,讲解,证明(简单易懂) 阅读详情

整除分块

首先引入一个问题,若我们要求这么一个式子:
∑ i = 1 n ⌊ n i ⌋ \sum\limits_{i=1}^{n} \left\lfloor\dfrac{n}{i}\right\rfloor i=1∑n​⌊in​⌋
自然而然会想到这么一段翻译代码:

for(int i=1;i<=n;i++)
  sum+=n/i;

但是,如果 1 ≤ n ≤ 1 0 9 1\le n\le10^9 1≤n≤109,又该如何解决呢?

显然, ⌊ n i ⌋ \left\lfloor\dfrac{n}{i}\right\rfloor ⌊in​⌋与 n i \dfrac{n}{i} in​的不同在于,前者的值在某些情况下会出现区间性的大量重复。
下面我们来考察当 n = 10 n=10 n=10时 ⌊ n i ⌋ \left\lfloor\dfrac{n}{i}\right\rfloor ⌊in​⌋的取值

10 5 3 2 2 1 1 1 1 1 \boxed{10}\quad \boxed{5}\quad \boxed{3}\quad \boxed{2\quad 2}\quad \boxed{1\quad 1\quad 1\quad 1\quad 1} 10​5​3​22​11111​
我们可以发现:
⌊ n 1 ⌋ = 10   ⌊ n 2 ⌋ = 5   ⌊ n 3 ⌋ = 3   ⌊ n 4 ⌋ = ⌊ n 5 ⌋ = 2   ⌊ n 6 ⌋ = ⌊ n 7 ⌋ = ⌊ n 8 ⌋ = ⌊ n 9 ⌋ = ⌊ n 10 ⌋ = 1 \left\lfloor\dfrac{n}{1}\right\rfloor=10\\ ~\\ \left\lfloor\dfrac{n}{2}\right\rfloor=5\\ ~\\ \left\lfloor\dfrac{n}{3}\right\rfloor=3\\ ~\\ \left\lfloor\dfrac{n}{4}\right\rfloor=\left\lfloor\dfrac{n}{5}\right\rfloor=2\\ ~\\ \left\lfloor\dfrac{n}{6}\right\rfloor=\left\lfloor\dfrac{n}{7}\right\rfloor=\left\lfloor\dfrac{n}{8}\right\rfloor=\left\lfloor\dfrac{n}{9}\right\rfloor=\left\lfloor\dfrac{n}{10}\right\rfloor=1 ⌊1n​⌋=10 ⌊2n​⌋=5 ⌊3n​⌋=3 ⌊4n​⌋=⌊5n​⌋=2 ⌊6n​⌋=⌊7n​⌋=⌊8n​⌋=⌊9n​⌋=⌊10n​⌋=1
显然重复部分(我们将他们成为块)占比很大,因此我们就找到了优化的突破口,如何优化在重复部分耗费的计算?

由于 i i i 单调递增排列,因此重复部分是连续出现的,对于一个块 [ l , r ] [l,r] [l,r],若求出了 l , r l,r l,r就可以快速计算一整个块整除意义上的贡献。

经过思考可以得到 l l l的初值必定为 1 1 1,还有一个很显然的 l l l 的转移方程:
l = r + 1 l=r+1 l=r+1
此时问题再次简单化,如何在已知 l l l的情况下,快速求出重复部分右端点 r r r?

考虑 r r r的性质:根据 [ l , r ] [l,r] [l,r]的定义可以得到 ⌊ n l ⌋ = ⌊ n r ⌋ \left\lfloor\dfrac{n}{l}\right\rfloor=\left\lfloor\dfrac{n}{r}\right\rfloor ⌊ln​⌋=⌊rn​⌋,我们将 ⌊ n l ⌋ \left\lfloor\dfrac{n}{l}\right\rfloor ⌊ln​⌋表示为 k k k 。
此时有:
k = ⌊ n r ⌋   n r ≥ k   ( 向 下 取 整 必 定 小 于 分 数 运 算 )   r n ≤ 1 k   r ≤ ⌊ n k ⌋ ( r ∈ Z ) k=\left\lfloor\dfrac{n}{r}\right\rfloor\\ ~\\ \dfrac{n}{r}\ge k~(向下取整必定小于分数运算)\\ ~\\ \dfrac{r}{n}\le \dfrac{1}{k}\\ ~\\ r\le \left\lfloor\dfrac{n}{k}\right\rfloor (r\in\Z) k=⌊rn​⌋ rn​≥k (向下取整必定小于分数运算) nr​≤k1​ r≤⌊kn​⌋(r∈Z)
此时若使 r r r 最大,则取等,即 r = ⌊ n k ⌋ = ⌊ n ⌊ n l ⌋ ⌋ r=\left\lfloor\dfrac{n}{k}\right\rfloor=\left\lfloor\dfrac{n}{\left\lfloor\dfrac{n}{l}\right\rfloor}\right\rfloor r=⌊kn​⌋=⎣⎢⎢⎢​⌊ln​⌋n​⎦⎥⎥⎥​
此时,我们已经得到了快速求出 l , r l,r l,r的算法,因此对于大量的重复贡献,我么可以利用 [ l , r ] [l,r] [l,r]区间快速得到总贡献,时间复杂度为 Θ ( n ) \Theta(\sqrt{n}) Θ(n ​)。
具体实现请看代码:

for(int l=1,r;l<=n;l=r+1)
{
  int k=n/l;
  r=n/k;
  sum=sum+(k*(r-l+1));  //相同贡献乘区间长度
}

我们习惯把以上优化算法称为整除分块(或除法分块、数论分块等),它可以优化以下类似式子的时间复杂度:
∑ i = 1 n f ( ⌊ n i ⌋ ) \sum\limits_{i=1}^{n}f(\left\lfloor\dfrac{n}{i}\right\rfloor) i=1∑n​f(⌊in​⌋)


例题深化

1. UVA11526

模板题,翻译都不需要的那种,直接整除分块优化。(过~~~)

2.P3935 Calculating

题目大意:求
若 n = p 1 c 1 ⋅ p 2 c 2 ⋯ p m c m , f ( n ) = ( c 1 + 1 ) ⋅ ( c 2 + 1 ) ⋯ ( c m + 1 )   ∑ i = l r f ( i )     m o d   998244353 若n=p_1^{c_1}\cdot p_2^{c_2}\cdots p_m^{c_m},f(n)=(c_1+1)\cdot(c_2+1)\cdots(c_m+1)\\ ~\\ \sum\limits_{i=l}^{r}f(i)~\bmod998244353\\ 若n=p1c1​​⋅p2c2​​⋯pmcm​​,f(n)=(c1​+1)⋅(c2​+1)⋯(cm​+1) i=l∑r​f(i) mod998244353

首先我们要知道 n = p 1 c 1 ⋅ p 2 c 2 ⋯ p m c m , 则 f ( n ) = ( c 1 + 1 ) ⋅ ( c 2 + 1 ) ⋯ ( c m + 1 ) n=p_1^{c_1}\cdot p_2^{c_2}\cdots p_m^{c_m},则f(n)=(c_1+1)\cdot(c_2+1)\cdots(c_m+1) n=p1c1​​⋅p2c2​​⋯pmcm​​,则f(n)=(c1​+1)⋅(c2​+1)⋯(cm​+1)即为 n n n的因数个数,可以由质因数的组合得到这个公式,这里不再详解。

回顾到这道题,要求区间 [ l , r ] [l,r] [l,r]中的数的因子个数之和,自然而然就是类似于前缀和式的方法:求出 [ 1 , l − 1 ] [1,l-1] [1,l−1]的因子和以及 [ 1 , r ] [1,r] [1,r]的因子和,然后后者减去前者,就可以得到 [ l , r ] [l,r] [l,r]的因子和。

可以知道, [ 1 , n ] [1,n] [1,n]中 i i i的倍数有 ⌊ n i ⌋ \left\lfloor\dfrac{n}{i}\right\rfloor ⌊in​⌋个,即有 ⌊ n i ⌋ \left\lfloor\dfrac{n}{i}\right\rfloor ⌊in​⌋个数包含因子 i i i。因此 ∑ i = 1 n f ( i ) = ∑ i = 1 n ⌊ n i ⌋ \sum\limits_{i=1}^{n}f(i)=\sum\limits_{i=1}^{n}\left\lfloor\dfrac{n}{i}\right\rfloor i=1∑n​f(i)=i=1∑n​⌊in​⌋

∑ i = l r f ( i ) = ∑ i = 1 r ⌊ r i ⌋ − ∑ i = 1 l − 1 ⌊ l i ⌋ \sum\limits_{i=l}^{r}f(i)=\sum\limits_{i=1}^{r}\left\lfloor\dfrac{r}{i}\right\rfloor-\sum\limits_{i=1}^{l-1}\left\lfloor\dfrac{l}{i}\right\rfloor i=l∑r​f(i)=i=1∑r​⌊ir​⌋−i=1∑l−1​⌊il​⌋

然后又变成了整除分块裸题。

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int MOD=998244353;
int a,b;
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
    cin>>a>>b;
    int suma=0,sumb=0;
    for(int l=1,r;l<=(a-1);l=r+1)
    {
      r=(a-1)/((a-1)/l);
      suma=(suma+(((a-1)/l)%MOD*(r-l+1)%MOD)%MOD)%MOD;
    }
    for(int l=1,r;l<=b;l=r+1)
    {
      r=b/(b/l);
      sumb=(sumb+((b/l)%MOD*(r-l+1)%MOD)%MOD)%MOD;
    }
    cout<<((sumb-suma)%MOD+MOD)%MOD;
	return 0;
}

3.CF616E Sum of Remainders

题目大意:
求
( ∑ i = 1 m n   m o d   i )   m o d   ( 1 0 9 + 7 ) (\sum\limits_{i=1}^{m}n\bmod i)\bmod (10^9+7) (i=1∑m​nmodi)mod(109+7)

很简单的一道推式子题,就是因为用上了整除分块才水上了紫。
∑ i = 1 m n   m o d   i = ∑ i = 1 m ( n − ⌊ n i ⌋ ⋅ i ) = n m − ∑ i = 1 m ⌊ n i ⌋ ⋅ i \sum\limits_{i=1}^{m}n\bmod i=\sum\limits_{i=1}^{m}(n-\left\lfloor\dfrac{n}{i}\right\rfloor\cdot i)=nm-\sum\limits_{i=1}^{m}\left\lfloor\dfrac{n}{i}\right\rfloor\cdot i i=1∑m​nmodi=i=1∑m​(n−⌊in​⌋⋅i)=nm−i=1∑m​⌊in​⌋⋅i
由于块中的元素重复,我们可以提取公因数,因此乘 i i i可以在整除分块的过程中执行,不会影响效率, ∑ i = 1 m ⌊ n i ⌋ i \sum\limits_{i=1}^{m}\left\lfloor\dfrac{n}{i}\right\rfloor i i=1∑m​⌊in​⌋i可以利用整除分块和高斯求和公式快速得到(不懂得可以停下来稍微想想)。

照水不误

  • 运算过程中会爆longlong,取余很恶心
  • 在这种恶心超大取余数论题中,常要预处理出某些除数的乘法逆元。
#include <bits/stdc++.h>
#define int long long
#define inv2 500000004//2在mod 1e9+7 意义下的乘法逆元
using namespace std;
int n,m;
int ans;
const int MOD=1e9+7;
signed main()
{
  cin>>n>>m;
  ans=((n%MOD)*(m%MOD))%MOD;
  int sum=0;
  for(int l=1,r;l<=min(n,m);l=r+1)
  {
    r=n/(n/l);
    if(r>m) r=m;
    sum=(1ll*sum%MOD+(1ll*(n/l)%MOD*((((r-l+1)%MOD)*((r+l)%MOD))%MOD*inv2%MOD)%MOD)%MOD)%MOD;
  }
  cout<<((ans-sum%MOD)%MOD+MOD)%MOD;
  return 0;
}

4.P2260 [清华集训2012]模积和

题目大意: 求
∑ i = 1 n ∑ j = 1 m ( n   m o d   i ) ⋅ ( m   m o d   j )    i ≠ j \sum\limits_{i=1}^{n}\sum\limits_{j=1}^m(n\bmod i)\cdot(m\bmod j)~~i\ne j i=1∑n​j=1∑m​(nmodi)⋅(mmodj)  i​=j
  m o d   19940417 \bmod 19940417 mod19940417的值

对于这种式子很长,没有思路的题目,往往需要我们将式子拆开来才能找到考点。
考虑式子条件 i ≠ j i\ne j i​=j的运算意义,就是在原有式子的基础上减去 i , j i,j i,j重复部分,即
∑ i = 1 n ∑ j = 1 m ( n   m o d   i ) ( m   m o d   j ) − ∑ i = 1 min ⁡ ( n , m ) ( n   m o d   i ) ( m   m o d   i ) \sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}(n \bmod i)(m\bmod j)-\sum\limits_{i=1}^{\min(n,m)}(n\bmod i)(m\bmod i) i=1∑n​j=1∑m​(nmodi)(mmodj)−i=1∑min(n,m)​(nmodi)(mmodi)
然后我们就可以愉快的手撕 ∑ \sum ∑:
∑ i = 1 n ∑ j = 1 m ( n   m o d   i ) ( m   m o d   j ) − ∑ i = 1 min ⁡ ( n , m ) ( n   m o d   i ) ( m   m o d   i ) ⇔ ∑ i = 1 n ( n   m o d   i ) ∑ j = 1 m ( m   m o d   j ) − ∑ i = 1 min ⁡ ( n , m ) ( n   m o d   i ) ( m   m o d   i ) ⇔ ∑ i = 1 n ( n   m o d   i ) ∑ j = 1 m ( m   m o d   j ) − ∑ i = 1 min ⁡ ( n , m ) ( n − ⌊ n i ⌋ ⋅ i ) ( m − ⌊ m i ⌋ ⋅ i ) ⇔ ∑ i = 1 n ( n   m o d   i ) ∑ j = 1 m ( m   m o d   j ) − ∑ i = 1 min ⁡ ( n , m ) ( n m − m ⋅ ⌊ n i ⌋ ⋅ i − n ⋅ ⌊ m i ⌋ ⋅ i + ⌊ m i ⌋ ⌊ n i ⌋ ⋅ i 2 ) ⇔ ∑ i = 1 n ( n   m o d   i ) ∑ j = 1 m ( m   m o d   j ) − ∑ i = 1 min ⁡ ( n , m ) n m + ∑ i = 1 min ⁡ ( n , m ) m ⌊ n i ⌋ i + ∑ i = 1 min ⁡ ( n , m ) n ⌊ m i ⌋ i − ∑ i = 1 min ⁡ ( n , m ) ⌊ m i ⌋ ⌊ n i ⌋ i 2 \sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}(n \bmod i)(m\bmod j)-\sum\limits_{i=1}^{\min(n,m)}(n\bmod i)(m\bmod i)\\ \Leftrightarrow\\ \sum\limits_{i=1}^{n}(n\bmod i)\sum\limits_{j=1}^{m}(m\bmod j)-\sum\limits_{i=1}^{\min(n,m)}(n\bmod i)(m\bmod i)\\ \Leftrightarrow\\ \sum\limits_{i=1}^{n}(n\bmod i)\sum\limits_{j=1}^{m}(m\bmod j)-\sum\limits_{i=1}^{\min(n,m)}(n-\left\lfloor\dfrac{n}{i}\right\rfloor\cdot i)(m-\left\lfloor\dfrac{m}{i}\right\rfloor\cdot i)\\ \Leftrightarrow\\ \sum\limits_{i=1}^{n}(n\bmod i)\sum\limits_{j=1}^{m}(m\bmod j)-\sum\limits_{i=1}^{\min(n,m)}(nm-m\cdot\left\lfloor\dfrac{n}{i}\right\rfloor\cdot i-n\cdot\left\lfloor\dfrac{m}{i}\right\rfloor\cdot i+\left\lfloor\dfrac{m}{i}\right\rfloor\left\lfloor\dfrac{n}{i}\right\rfloor\cdot i^2)\\ \Leftrightarrow\\ \sum\limits_{i=1}^{n}(n\bmod i)\sum\limits_{j=1}^{m}(m\bmod j)-\sum\limits_{i=1}^{\min(n,m)}nm+\sum\limits_{i=1}^{\min(n,m)}m\left\lfloor\dfrac{n}{i}\right\rfloor i+\sum\limits_{i=1}^{\min(n,m)}n\left\lfloor\dfrac{m}{i}\right\rfloor i-\sum\limits_{i=1}^{\min(n,m)}\left\lfloor\dfrac{m}{i}\right\rfloor\left\lfloor\dfrac{n}{i}\right\rfloor i^2 i=1∑n​j=1∑m​(nmodi)(mmodj)−i=1∑min(n,m)​(nmodi)(mmodi)⇔i=1∑n​(nmodi)j=1∑m​(mmodj)−i=1∑min(n,m)​(nmodi)(mmodi)⇔i=1∑n​(nmodi)j=1∑m​(mmodj)−i=1∑min(n,m)​(n−⌊in​⌋⋅i)(m−⌊im​⌋⋅i)⇔i=1∑n​(nmodi)j=1∑m​(mmodj)−i=1∑min(n,m)​(nm−m⋅⌊in​⌋⋅i−n⋅⌊im​⌋⋅i+⌊im​⌋⌊in​⌋⋅i2)⇔i=1∑n​(nmodi)j=1∑m​(mmodj)−i=1∑min(n,m)​nm+i=1∑min(n,m)​m⌊in​⌋i+i=1∑min(n,m)​n⌊im​⌋i−i=1∑min(n,m)​⌊im​⌋⌊in​⌋i2
我们使 m < n m<n m<n:
∑ i = 1 n ( n   m o d   i ) ∑ j = 1 m ( m   m o d   j ) − ∑ i = 1 m n m + ∑ i = 1 m m ⌊ n i ⌋ i + ∑ i = 1 m n ⌊ m i ⌋ i − ∑ i = 1 m ⌊ m i ⌋ ⌊ n i ⌋ i 2 ⇔ ∑ i = 1 n ( n   m o d   i ) ∑ j = 1 m ( m   m o d   j ) − n m 2 + m ∑ i = 1 m ⌊ n i ⌋ i + n ∑ i = 1 m ⌊ m i ⌋ i − ∑ i = 1 m ⌊ m i ⌋ ⌊ n i ⌋ i 2 \sum\limits_{i=1}^{n}(n\bmod i)\sum\limits_{j=1}^{m}(m\bmod j)-\sum\limits_{i=1}^{m}nm+\sum\limits_{i=1}^{m}m\left\lfloor\dfrac{n}{i}\right\rfloor i+\sum\limits_{i=1}^{m}n\left\lfloor\dfrac{m}{i}\right\rfloor i-\sum\limits_{i=1}^{m}\left\lfloor\dfrac{m}{i}\right\rfloor\left\lfloor\dfrac{n}{i}\right\rfloor i^2\\ \Leftrightarrow\\ \sum\limits_{i=1}^{n}(n\bmod i)\sum\limits_{j=1}^{m}(m\bmod j)-nm^2+m\sum\limits_{i=1}^{m}\left\lfloor\dfrac{n}{i}\right\rfloor i+n\sum\limits_{i=1}^{m}\left\lfloor\dfrac{m}{i}\right\rfloor i-\sum\limits_{i=1}^{m}\left\lfloor\dfrac{m}{i}\right\rfloor\left\lfloor\dfrac{n}{i}\right\rfloor i^2 i=1∑n​(nmodi)j=1∑m​(mmodj)−i=1∑m​nm+i=1∑m​m⌊in​⌋i+i=1∑m​n⌊im​⌋i−i=1∑m​⌊im​⌋⌊in​⌋i2⇔i=1∑n​(nmodi)j=1∑m​(mmodj)−nm2+mi=1∑m​⌊in​⌋i+ni=1∑m​⌊im​⌋i−i=1∑m​⌊im​⌋⌊in​⌋i2
这个式子结构性就很强了,我们可以考虑逐一求得式子各部分的值来得到最终答案。

  • part 1: ∑ i = 1 n ( n   m o d   i ) ∑ j = 1 m ( m   m o d   j ) \sum\limits_{i=1}^{n}(n\bmod i)\sum\limits_{j=1}^{m}(m\bmod j) i=1∑n​(nmodi)j=1∑m​(mmodj)
    很显然就是上一题的结论与做法,不再赘述。

  • part 2: n m 2 nm^2 nm2
    入门级运算

  • part 3: m ∑ i = 1 m ⌊ n i ⌋ i + n ∑ i = 1 m ⌊ m i ⌋ i m\sum\limits_{i=1}^m\left\lfloor\dfrac{n}{i}\right\rfloor i+n\sum\limits_{i=1}^{m}\left\lfloor\dfrac{m}{i}\right\rfloor i mi=1∑m​⌊in​⌋i+ni=1∑m​⌊im​⌋i
    依旧是上一题结论,换汤不换药。

  • part 4: ∑ i = 1 m ⌊ m i ⌋ ⌊ n i ⌋ i 2 \sum\limits_{i=1}^{m}\left\lfloor\dfrac{m}{i}\right\rfloor\left\lfloor\dfrac{n}{i}\right\rfloor i^2 i=1∑m​⌊im​⌋⌊in​⌋i2

看到这个式子我一开始就蒙了(太弱了),是不是式子柴得不够完全啊,然后就浪费了大量的时间来化简这个式子,最后还是做了无用功。

那到底应该如何处理呢?观察这部分式子, ⌊ m i ⌋ \left\lfloor\dfrac{m}{i}\right\rfloor ⌊im​⌋与 ⌊ n i ⌋ \left\lfloor\dfrac{n}{i}\right\rfloor ⌊in​⌋都是我们熟悉的整除分块,但是要是将他们联系在一起 ⌊ m i ⌋ ⌊ n i ⌋ \left\lfloor\dfrac{m}{i}\right\rfloor\left\lfloor\dfrac{n}{i}\right\rfloor ⌊im​⌋⌊in​⌋显然不是简单的直接分块相乘,那又该如何优化呢?借助上一题的思路,利用块的优化过程自然也要带上计算 i 2 i^2 i2,那是否 ∑ i = 1 n i 2 \sum\limits_{i=1}^{n}i^2 i=1∑n​i2也具有类似等差数列一样的求和公式呢(我太弱了不知道,在教练的帮助下推了好久才推出来)?

我们来模拟一下 ∑ i = 1 m ⌊ m i ⌋ ⌊ n i ⌋ \sum\limits_{i=1}^{m}\left\lfloor\dfrac{m}{i}\right\rfloor\left\lfloor\dfrac{n}{i}\right\rfloor i=1∑m​⌊im​⌋⌊in​⌋的过程,考虑 n = 20 , m = 17 n=20,m=17 n=20,m=17

20 ⋅ 17 10 ⋅ 8 6 ⋅ 5 5 ⋅ 4 4 ⋅ 3 3 ⋅ 2 2 ⋅ 2 2 ⋅ 2 2 ⋅ 1 2 ⋅ 1   1 ⋅ 1 1 ⋅ 1 1 ⋅ 1 1 ⋅ 1 1 ⋅ 1 1 ⋅ 1 1 ⋅ 1 \boxed{20\cdot 17}\quad\boxed{10\cdot 8}\quad\boxed{6\cdot5}\quad\boxed{5\cdot 4}\quad\boxed{4\cdot 3}\quad\boxed{3\cdot 2}\quad\boxed{2\cdot 2\quad 2\cdot 2}\quad\boxed{2\cdot 1\quad2\cdot 1}\\ ~\\ \boxed{1\cdot 1\quad1\cdot 1\quad1\cdot 1\quad1\cdot 1\quad1\cdot 1\quad1\cdot 1\quad1\cdot 1} 20⋅17​10⋅8​6⋅5​5⋅4​4⋅3​3⋅2​2⋅22⋅2​2⋅12⋅1​ 1⋅11⋅11⋅11⋅11⋅11⋅11⋅1​

稍加思索可以发现, ⌊ n i ⌋ \left\lfloor\dfrac{n}{i}\right\rfloor ⌊in​⌋所分的一个块与 ⌊ m i ⌋ \left\lfloor\dfrac{m}{i}\right\rfloor ⌊im​⌋所分的一个块的交集(公共部分)也是 ⌊ n i ⌋ ⌊ m i ⌋ \left\lfloor\dfrac{n}{i}\right\rfloor\left\lfloor\dfrac{m}{i}\right\rfloor ⌊in​⌋⌊im​⌋的一个块。

稍微数学一点的表达:
若 A 为 ⌊ n i ⌋ 的 一 个 块 , B 为 ⌊ m i ⌋ 的 一 个 快   记 作   A ∈ ⌊ n i ⌋ , B ∈ ⌊ m i ⌋   则 有   ( A ∩ B ) ∈ ⌊ n i ⌋ ⌊ m i ⌋ 若A为\left\lfloor\dfrac{n}{i}\right\rfloor的一个块,B为\left\lfloor\dfrac{m}{i}\right\rfloor的一个快\\ ~\\ 记作~A\in\left\lfloor\dfrac{n}{i}\right\rfloor,B\in\left\lfloor\dfrac{m}{i}\right\rfloor\\ ~\\ 则有~(A\cap B)\in \left\lfloor\dfrac{n}{i}\right\rfloor\left\lfloor\dfrac{m}{i}\right\rfloor 若A为⌊in​⌋的一个块,B为⌊im​⌋的一个快 记作 A∈⌊in​⌋,B∈⌊im​⌋ 则有 (A∩B)∈⌊in​⌋⌊im​⌋
有了这个概念,我们就易得 ⌊ n i ⌋ ⌊ m i ⌋ \left\lfloor\dfrac{n}{i}\right\rfloor\left\lfloor\dfrac{m}{i}\right\rfloor ⌊in​⌋⌊im​⌋的块 [ l , r ] [l,r] [l,r]的左右端点转移方程:
{ r = min ⁡ ( ⌊ n ⌊ n l ⌋ ⌋ , ⌊ m ⌊ m l ⌋ ⌋ )   l = r + 1 \begin{cases} r=\min(\left\lfloor\dfrac{n}{\left\lfloor\dfrac{n}{l}\right\rfloor}\right\rfloor,\left\lfloor\dfrac{m}{\left\lfloor\dfrac{m}{l}\right\rfloor}\right\rfloor)\\ ~\\ l=r+1 \end{cases} ⎩⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎧​r=min(⎣⎢⎢⎢​⌊ln​⌋n​⎦⎥⎥⎥​,⎣⎢⎢⎢​⌊lm​⌋m​⎦⎥⎥⎥​) l=r+1​

接下来我们考虑推导 S n = ∑ i = 1 n i 2 S_n=\sum\limits_{i=1}^ni^2 Sn​=i=1∑n​i2 的通项式。

考虑
∵ ( n + 1 ) 3 = n 3 + 3 n 2 + 3 n + 1   ∴ ( n + 1 ) 3 − n 3 = 3 n 2 + 3 n + 1   ∴ { 2 3 − 1 3 = 3 ⋅ 1 2 + 3 + 1 = 7 3 3 − 2 3 = 3 ⋅ 2 2 + 3 ⋅ 2 + 1 = 19 4 3 − 3 3 = 3 ⋅ 3 2 + 3 ⋅ 3 + 1 = 37 ⋯ ( n + 1 ) 3 − n 3 = 3 n 2 + 3 n + 1   ∴ ( n + 1 ) 3 − 1 3 = ∑ i = 1 n ( ( i + 1 ) 3 − i 3 ) = 3 ∑ i = 1 n n 2 + 3 ∑ i = 1 n i + ∑ i = 1 n 1 = 3 ⋅ S n + 3 ⋅ ( n + 1 ) n 2 + n ∴ S n = ( n + 1 ) 3 3 − 1 3 − ( n + 1 ) n 2 − n 3 = 2 ( n + 1 ) 3 6 − 2 6 − 3 ( n + 1 ) n 6 − 2 n 6 = 2 ( n + 1 ) 3 − 2 − 3 ( n + 1 ) n − 2 n 6 = 2 n 3 + 6 n 2 + 6 n + 2 − 2 − 3 n 2 − 3 n − 2 n 6 = 2 n 3 + 3 n 2 + n 6 = n ( n + 1 ) ( 2 n + 1 ) 6      ( 提 取 公 因 数 后 再 十 字 相 乘 化 简 ) \because(n+1)^3=n^3+3n^2+3n+1\\ ~\\ \therefore(n+1)^3-n^3=3n^2+3n+1\\ ~\\ \therefore \begin{cases} 2^3-1^3=3\cdot 1^2+3+1=7\\ 3^3-2^3=3\cdot 2^2+3\cdot 2+1=19\\ 4^3-3^3=3\cdot3^2+3\cdot3+1=37\\ \cdots\\ (n+1)^3-n^3=3n^2+3n+1 \end{cases}\\ ~\\ \therefore\begin{aligned} (n+1)^3-1^3&=\sum\limits_{i=1}^{n}\left((i+1)^3-i^3\right)\\ &=3\sum\limits_{i=1}^{n}n^2+3\sum\limits_{i=1}^{n}i+\sum\limits_{i=1}^n1\\ &=3\cdot S_n+3\cdot\dfrac{(n+1)n}{2}+n \end{aligned}\\ \therefore\begin{aligned} S_n&=\dfrac{(n+1)^3}{3}-\dfrac{1}{3}-\dfrac{(n+1)n}{2}-\dfrac{n}{3}\\ &=\dfrac{2(n+1)^3}{6}-\dfrac{2}{6}-\dfrac{3(n+1)n}{6}-\dfrac{2n}{6}\\ &=\dfrac{2(n+1)^3-2-3(n+1)n-2n}{6}\\ &=\dfrac{2n^3+6n^2+6n+2-2-3n^2-3n-2n}{6}\\ &=\dfrac{2n^3+3n^2+n}{6}\\ &=\dfrac{n(n+1)(2n+1)}{6}~~~~(提取公因数后再十字相乘化简)\\ \end{aligned} ∵(n+1)3=n3+3n2+3n+1 ∴(n+1)3−n3=3n2+3n+1 ∴⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧​23−13=3⋅12+3+1=733−23=3⋅22+3⋅2+1=1943−33=3⋅32+3⋅3+1=37⋯(n+1)3−n3=3n2+3n+1​ ∴(n+1)3−13​=i=1∑n​((i+1)3−i3)=3i=1∑n​n2+3i=1∑n​i+i=1∑n​1=3⋅Sn​+3⋅2(n+1)n​+n​∴Sn​​=3(n+1)3​−31​−2(n+1)n​−3n​=62(n+1)3​−62​−63(n+1)n​−62n​=62(n+1)3−2−3(n+1)n−2n​=62n3+6n2+6n+2−2−3n2−3n−2n​=62n3+3n2+n​=6n(n+1)(2n+1)​    (提取公因数后再十字相乘化简)​

此时,我们已经解决了关于这道题的所有难点,有了二维整除分块以及 ∑ i = 1 n i 2 \sum\limits_{i=1}^ni^2 i=1∑n​i2的求和公式,我么就可仿照类似上一题一般的方法优化 ∑ i = 1 m ⌊ n i ⌋ ⌊ m i ⌋ i 2 \sum\limits_{i=1}^m\left\lfloor\dfrac{n}{i}\right\rfloor\left\lfloor\dfrac{m}{i}\right\rfloor i^2 i=1∑m​⌊in​⌋⌊im​⌋i2。

此时,我们首先化简题目的式子,然后对式子各部分进行逐一处理优化,最后得到了最终的算法:

处理以下函数

  • F x : ∑ i = 1 x ( x   m o d   i ) F_x:\sum\limits_{i=1}^x(x\bmod i) Fx​:i=1∑x​(xmodi)
  • G x , y : ∑ i = 1 x ( y   m o d   i ) G_{x,y} :\sum\limits_{i=1}^x(y\bmod i) Gx,y​:i=1∑x​(ymodi)
  • T : ∑ i = 1 m ⌊ n i ⌋ ⌊ m i ⌋ i 2 T:\sum\limits_{i=1}^m\left\lfloor\dfrac{n}{i}\right\rfloor\left\lfloor\dfrac{m}{i}\right\rfloor i^2 T:i=1∑m​⌊in​⌋⌊im​⌋i2

最终答案为: F n F m − n m 2 + n G m , m + m G m , n − T F_nF_m-nm^2+nG_{m,m}+mG_{m,n}-T Fn​Fm​−nm2+nGm,m​+mGm,n​−T

#include<bits/stdc++.h>
#define int long long
const long long MOD=19940417,inv6=3323403,inv2=9970209;  //预处理公式中除数的乘法逆元
using namespace std;
int n,m;
int G(int s,int t)
{
  int sum=0;
  for(int l=1,r;l<=s;l=r+1)
  {
    r=min(t/(t/l),s);
    sum=(sum+1ll*(t/l)*(r+l)%MOD*(r-l+1)%MOD*inv2)%MOD;
  }
  return sum%MOD;
}
int F(int s)
{
  return (1ll*s*s-G(s,s))%MOD;
}
int S(int s)
{
  return 1ll*s*(s+1)%MOD*(s+s+1)%MOD*inv6%MOD;
}
int ans()
{
  int a;
  a=1ll*F(n)*F(m)%MOD;
  a=(a+1ll*n*G(m,m)+1ll*m*G(m,n))%MOD;
  a=1ll*(a-1ll*m*m%MOD*n)%MOD;
  return a;
}
int T()
{
  int sum=ans();
  for(int l=1,r;l<=m;l=r+1)
  {
    r=min(n/(n/l),m/(m/l));
    sum=(sum-1ll*((n/l)%MOD*(m/l))%MOD*(S(r)-S(l-1))%MOD)%MOD;
  }
  return (sum%MOD+MOD)%MOD;
}
signed main()
{
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cin>>n>>m;
  if(m>n) swap(m,n);
  cout<<T();
  return 0;
}
【算法笔记】整除分块 整除分块 整除分块,就是把 nnn 除以每一个 iii 的商相同的分成一块 枚举(l,r)(l,r)(l,r)区间即对于该分块区间任何一个数来说,n/r=n/ln/r = n/ln/r=n/l。 移项得到r=n/n/lr = n/n/lr=n/n/l。 ∑i=1n⌊ni⌋\sum_{i=1}^{n}\lfloor\frac{n}{i}\rfloori=1∑n​⌊in​⌋ 模板代码: for(ll l = 1, r;l <= n; l = r + 1){ r = n / (n / l) 阅读详情

相关推荐

整除分块/数论分块

整除分块/数论分块 文章目录整除分块/数论分块定义分块区间端点例题及分析洛谷 P2261 余数求和牛客: 天花板 参考: 整数分块及详细证明 整除分块 定义 计算 ∑i=1n⌊ni⌋\sum_{i=1}^{n}\lfloor\frac{n}{i}\rfloor∑i=1n​⌊in​⌋ ,打表时间复杂度是O(n)O(n)O(n) 。显然存在区间[l,r][l, r][l,r],⌊nl⌋=⌊nr⌋\lfloor \frac{n}{l}\rfloor = \lfloor \frac{n}{r} \rfloor⌊

lih627 591

数论 筛法笔记

数论 筛法笔记

aaaghyaa的博客 229

金融领域强化学习在多资产类别动态交易执行中的应用

在金融市场中,多资产类别的交易执行面临着诸多挑战,如市场的不确定性、资产间的复杂相关性等。传统的交易策略往往难以适应动态变化的市场环境。本研究的目的在于探索如何运用强化学习技术,实现多资产类别在动态市场环境下的高效交易执行。具体范围涵盖了从强化学习的基本原理到在多资产交易场景中的实际应用,包括核心算法的实现、数学模型的构建以及项目实战等方面。本文首先介绍研究背景,包括目的、预期读者和文档结构。接着阐述核心概念,包括强化学习和多资产类别动态交易执行的原理及其联系。

AI 领航者的博客 629

取整函数及其性质

1、定义:取整函数是一类将实数映射到相近的整数的函数。 2、分类:常用的取整函数有两个,分别是下取整函数和上取整函数。 3、形式: 下取整函数在数学中一般记作,在计算机科学中一般记作 floor(x); 上取整函数在数学中一般记作,在计算机科学中一般记作ceil(x)。 4、性质:(仅列举计算机学习中经常用到的性质) a) , ,

风云龙儿的专栏 2万+

Silvaco光电探测学习笔记(一)——有关响应和暗电流

习惯用md记笔记,索性发出来,一是为了在线同步,二是希望能帮到需要的人。

qq_41584406的博客 8012

无人驾驶小车调试笔记(六)-- 车轮校准

简介:小车的动力完全来自于两个电机带动的车轮,在理想状态下,给两个电机同样的驱动参数,两个车轮会以同样的转速带动小车直线行驶,而实际情况是每个电机可能都会有个体差异,也就是说给予同样的驱动参数,表现出的转动速度会有些许不同,两个轮子的差速会导致车辆拐弯,后果就是给了直线行驶的控制命令,但是车走着走着就偏离了原本的方向,所以在开始控制之前,我们需要先平衡两个车轮的转速,保证在同样驱动参数下,两个车轮转速大致相同,也就是可以走直线。 车轮校准分为3步,测试、调整后再测试、保存参...

aibingjin的博客 1820

整除分块(入门)

整除分块属于数论的一部分。这里尽可能脱离数论的知识。看一道例题。 已知正整数n,求 ∑i=0n=⌊ni⌋\sum_{i=0}^n=\lfloor\frac{n}{i}\rfloori=0∑n​=⌊in​⌋ 以n=8为例,结果如下表 i 1 2 3 4 5 6 7 8 ⌊ni⌋\lfloor\frac{n}{i}\rfloor⌊in​⌋ 8 4 2 2 1 1 1 1 可以看到上面的表中相连着的同一数值的区间不少,由这些数值可以将这张表划分为多个区间块,这就是整除分块了。整除的性质使得从1

czyzx的博客 317

RK3588S开发板实战:手把手教你搞定IMX415摄像头驱动配置(附调试日志分析)

本文提供了一份详细的RK3588S开发板配置IMX415摄像头驱动的实战指南。内容涵盖从环境准备、内核驱动编译、设备树节点编写到调试日志分析的完整流程,并重点解析了摄像头调试过程中的常见问题与解决方案,帮助开发者快速完成驱动配置与功能验证。

weixin_28285943的博客 204

数列分块(整除分块)入门

大佬讲解博客:https://www.cnblogs.com/peng-ym/p/8661118.html 当所求答案式子类似于∑⌊ni⌋\sum \lfloor \frac{n}{i}\rfloor∑⌊in​⌋类型,显然有一个O(n)的方法,但有时 n 特别大,超过了可运行的复杂度之内,这时要应用数列分块:通过打表可以观察到 ⌊ni⌋\lfloor \frac{n}{i}\rfloor⌊in​...

qq_41997978的博客 396

整理笔记——二极管

二极管是一种由半导体材料制成的一种具有单向导电性能的电子元器件,二极管的核心是PN结。加在二极管两端的电压和通关的电流被成为,二极管的伏安特性曲线​​​二极管的正向特性:起初正向电压较小时,正向电流几乎没有,称之为死区,此时二极管处于截止状态。当电压差超过截止电压(0.5V或者0.7V),电流随着电压上升,开始增加缓慢,随后急剧增大,二极管的电阻变小进入导通状态,此时电压变化较小。二极管的反向特性:起初反向电流很小,不随电压二变化,此时成为反向饱和电流;当方向电压达到二极管的反向击穿电压。

#include 811

如何实现电路级别的CDM ESD防护

采用先进制程的CMOS工艺,可能具有比以前更薄的栅极氧化物和更大的芯片尺寸,大的衬底可能积累大量的电荷,导致CDM事件期间的高ESD放电峰值电流。传统CDM保护器件使用栅极接地NMOS被添加到输入级的栅极。然而,这种方法通常会在信号路径上引入显著的寄生电容,这不适合RF应用。

weixin_42693135的博客 2500

莫比乌斯反演入门题

先简单复习下莫比乌斯反演 莫比乌斯函数定义 筛法 void init() { mu[1]=1; for(int i = 2; i<maxn; i++) { if(vis[i]==0) { vis[i]=1; pri[cnt++]=i; mu[i]=-1; ...

Verymuch 441

chromium通信系统-ipcz系统(二)-ipcz系统代码实现-同Node通信

在chromium通信系统-mojo系统(一)-ipcz系统基本概念一文中我们介绍了ipcz的基本概念。 本章我们来通过代码分析它的实现。 handle系统 为了不对上层api暴露太多细节,实现解耦,也方便于传输,ipcz系统使用handle表示一个对象,handle类似于文件描述符,用IpczHandle类型表示ipcz系统内的一个对象。一个可以用IpczHandle 句柄表示的对象必须是APIObject子类。APIObject数据结构如下 class APIObject : public RefCou

woai110120130的专栏 1774

模积和 洛谷2260 bzoj2956 整除分块、逆元

题意: 求∑i=1n∑j=1m(n&amp;amp;nbsp;mod&amp;amp;nbsp;i)∗(m&amp;amp;nbsp;mod&amp;amp;nbsp;j),i≠j∑i=1n∑j=1m(n&amp;amp;nbsp;mod&amp;amp;nbsp;i)∗(m&amp;amp;nbsp;mod&amp;amp;nbsp;j),i≠j\sum_{i=1}^n\sum_{j=1}^m(n\ mod\ i)*(m\ mod\ j),

forever_shi的博客 365

在 SAP ABAP 生态中偏爱面向对象,而不是过程式堆叠

本文探讨了ABAP开发中过程式与面向对象编程的共存现状及优化方向。文章指出,虽然过程式编程在ABAP中仍广泛存在,但随着业务复杂度提升,面向对象编程在可维护性、可测试性和重构便利性方面展现出明显优势。作者建议将过程式代码作为"适配层",仅负责输入输出转换,而将核心业务逻辑封装在类中。文章通过实际案例展示了这种架构如何提高交付效率,并提供了将Function Module转化为"薄包装"的具体实现方案,强调面向对象设计在SAP Gateway和RAP等现代架构中的重要性

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 132

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

【数论】整除分块(数论分块)

整除分块(数论分块)的介绍,包括复杂度分析,分块边界计算,一般模板,例题及详解

Wmiracle的博客 1万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

浅谈整除分块

浅谈整除分块 前言 我们在学习整除分块之前,首先你得整除分块就是是个什么,它跟分块(区间操作)相似但是不同(我学的时候有点小懵一直以为是分块然后额)。 我是在学习莫比乌斯反演的时候看到要先学前置知识整除分块,于是去学习。(整除分块比狄利克雷卷积简单多了,虽然我到现在还是不会狄利克雷卷积和莫比乌斯反演。) 例题 洛谷 余数求和 给出正整数n和k,计算G(n, k)=k mod 1 + k mod 2...

beautiful_CXW的博客 5729

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

整除分块(上下取整)

整除分块(上下取整)思路整理

qq_45809243的博客 2089

【数论】整除分块

这篇文章介绍了“整除分块”技巧,这是一个在处理数论问题时极其重要的高效算法,特别适用于大数据范围。在文章中,通过简单题目引入该技巧,推导了相应的通用模板,并展示了具体应用的例题。利用整除分块,算法能够有效地减少计算复杂度,从而快速解决大规模数据问题。

yigan_Eins的博客 1096

整除分块

应用场景 除以某一个递增的变量,且向下取整。 Tip: 向上取整也能做,i换成多项式也能做。 这篇讲的入门 这篇讲的进阶 看完了入门,这里只说一下两点。 考虑R不要超过n。 为什么R = k / (k / L) 整除分块(模板) 稍做变换,出现了应用场景中的形式。 整除分块每道题都不一样,模板不方便直接套,建议了解一下原理。 /* * Author: Chen_zhuozhuo * Created Time: 2020/8/2 8:10:53 * File Name: a.cpp *

weixin_43145397的博客 2256

数学--数论--整除分块(巨TM详细,学不会,你来打我)

1.概念 从一道例题说起 在介绍整除分块之前,我们先来看一道算数题:已知正整数n,求∑i=1n⌊ni⌋已知正整数n,求∑i=1n⌊ni⌋在介绍整除分块之前,我们先来看一道算数题: 已知正整数n,求∑i=1n⌊ni⌋\begin{aligned}已知正整数n,求\sum_{i=1}^n \left⌊\dfrac{n}{i}\right⌋\end{aligned}在介绍整除分块之前,我们先来看一道算数...

日拱一卒,功不唐捐 9762

整除分块算法

引入 整除分块是数论问题中非常常用的技巧,先来看一个简单的问题: 已知,给定一个 n,求 的值。 先假设 ,第一反应肯定是 遍历一遍 1 ~ n 直接求和,轻松得到答案。 但如果 ,甚至 呢,显然就不能 暴力了,这就得用到接下来要介绍的整除分块的内容。 找规律 我们先试着计算一下 前几项(几十项)的值,比如 n = 20: iii 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ni\frac{n}{i}in​ 20 10 6

2302_81590667的博客 771

整除分块(数论分块)

整除分块(数论分块)前言数学符号说明整除分块问题单调性分块分块数量分块上下界代码 前言 (第一次写博客不太懂,有什么不对的地方望指出,我会尽快改正) 最近在学莫比乌斯反演,发现几乎每一道莫反的题都需要用到整除分块,所以我来介绍一下整除分块的内容 数学符号说明 (在网上看了很多讲解,很少有这类说明可能是大佬们太苣觉得不需要,对我这样数学基础薄弱的初中蒟蒻很不友好,所以还是说明一下) ⌈ab⌉\lceil\frac{a}{b}\rceil⌈ba​⌉:a除以b向上取整 ⌊ab⌋\lfloor\frac{a}

weixin_53803696的博客 958

整除分块,数论分块

详解整除分块。

wanglianda2007的博客 373

整除分块的平民分析法

本文讲解了如何在不知数论为何物的情况下简洁又快速地推导出整除分块的分块区间左右端点的公式,正所谓整除分块的平民分析法,并以两道真题为例进行讲解。

gdhy9064的博客 908
上一篇: 线性同余与乘法逆元
下一篇: Baby Step Giant Step 初步
.SAI.
博客等级 码龄5年 835粉丝 63原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值