首页 > 其他分享 >数论分块

数论分块

时间:2024-10-16 22:11:13浏览次数:8  
标签:lfloor frac 分块 数论 sum mid rfloor bigg

数论分块

讲解先咕咕,做杜教筛做错题了做了个数论分块,下次再讲。

题目示例

P3327 [SDOI2015] 约数个数和

设 \(d(x)\) 为 \(x\) 的约数个数,给定 \(n,m\),求

\[\sum_{i=1}^n\sum_{j=1}^md(ij) \]

对于 \(100\%\) 的数据,\(1\le T,n,m \le 50000\)。


\[\sum_{i=1}^n\sum_{j=1}^md(ij) = \sum_{i=1}^n\sum_{j=1}^m\sum_{d \mid ij} 1 \]

设 \(xy = d\),考虑把 \(d\) 分解有什么情况,由于所有的 \(d\) 值是唯一的,所以每一个 \(x\) 和 \(y\) 的枚举需要唯一,不妨设 \(x \mid i\),\(y \mid j\),考虑 \(xy\) 什么时候唯一对应 \(ij\) 的因数。

可以发现,如果 \(xy\) 不能唯一对应 \(ij\) 的因数时,说明 \(xy\) 有多种拆解方式,而 \(x \mid i\),\(y \mid j\),因此,如果 \(x, y\) 含有共同的因子,这 \(xy\) 是可以再分的,因此所以它的充要条件是 \([\gcd(x, y) = 1]\),原始可继续改写。

\[\sum_{i=1}^n\sum_{j=1}^m\sum_{d \mid ij} 1 = \sum_{i=1}^n\sum_{j=1}^m\sum_{x \mid i}\sum_{y \mid j}[\gcd(x, y) = 1] \]

又有 \(x, y\) 的求和是独立的,可以改写。

\[\begin{aligned} \sum_{i=1}^n\sum_{j=1}^m\sum_{x \mid i}\sum_{y \mid j}[\gcd(x, y) = 1] &= \sum_{x = 1}^n\sum_{y = 1}^m\sum_{x \mid i}^n\sum_{y \mid j}^m[\gcd(x, y) = 1] ] \\ &= \sum_{x = 1}^n\sum_{y = 1}^m\bigg\lfloor\frac{n}{x}\bigg\rfloor\bigg\lfloor\frac{m}{y}\bigg\rfloor[\gcd(x, y) = 1] \\ \end{aligned} \]

考虑莫比乌斯反演 \(\sum\limits_{d \mid n} \mu(d) = [n = 1]\)。

\[\begin{aligned} \sum_{x = 1}^n\sum_{y = 1}^m\bigg\lfloor\frac{n}{x}\bigg\rfloor\bigg\lfloor\frac{m}{y}\bigg\rfloor[\gcd(x, y) = 1] &= \sum_{x = 1}^n\sum_{y = 1}^m\bigg\lfloor\frac{n}{x}\bigg\rfloor\bigg\lfloor\frac{m}{y}\bigg\rfloor\sum_{d \mid \gcd(x, y)}\mu(d) \\ &= \sum_{d = 1}^n\mu(d)\sum_{d \mid x}^n\sum_{d \mid y}^m\bigg\lfloor\frac{n}{x}\bigg\rfloor\bigg\lfloor\frac{m}{y}\bigg\rfloor \\ &= \sum_{d = 1}^n\mu(d)\sum_{i = 1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j = 1}^{\lfloor\frac{m}{d}\rfloor}\bigg\lfloor\frac{n}{di}\bigg\rfloor\bigg\lfloor\frac{m}{dj}\bigg\rfloor \\ &= \sum_{d = 1}^n\mu(d)\left(\sum_{i = 1}^{\lfloor\frac{n}{d}\rfloor}\bigg\lfloor\frac{n}{di}\bigg\rfloor\right)\left(\sum_{j = 1}^{\lfloor\frac{m}{d}\rfloor}\bigg\lfloor\frac{m}{dj}\bigg\rfloor\right) \end{aligned} \]

设 \(S(n) = \sum\limits_{i = 1}^{n}\lfloor\frac{n}{i}\rfloor\),则原式可替换为:

\[\sum_{d = 1}^n\mu(d)S\left(\bigg\lfloor\frac{n}{d}\bigg\rfloor\right)S\left(\bigg\lfloor\frac{m}{d}\bigg\rfloor\right) \]

预处理一下 \(\mu(n)\) 的前缀和与 \(S(n)\) 的值,进行数论分块即可。

参考代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 5e4 + 10;
int cnt, st[N], primes[N];
int n, m;
ll S[N], mu[N];

void init()
{
    mu[1] = 1;
    for (ll i = 2; i < N; i ++ )
    {
        if (!st[i]) primes[cnt ++ ] = i, mu[i] = -1;
        for (int j = 0; primes[j] * i < N; j ++ )
        {
            st[primes[j] * i] = 1;
            if (i % primes[j] == 0) break;
            mu[primes[j] * i] = -mu[i];
        }
    }
    for (int i = 1; i < N; i ++ )
    {
        mu[i] += mu[i - 1];
        for (int l = 1, r; l <= i; l = r + 1)
        {
            r = i / (i / l);
            S[i] += 1ll * (r - l + 1) * (i / l);
        }
    }
}

ll calc(int n, int m)
{
    ll res = 0;
    for (int l = 1, r; l <= min(n, m); l = r + 1)
    {
        r = min(n / (n / l), m / (m / l));
        res += (mu[r] - mu[l - 1]) * S[n / l] * S[m / l];
    }
    return res;
}

void solve()
{
    scanf("%d%d", &n, &m);
    printf("%lld\n", calc(n, m));
}

int main()
{
    init();
    int T;
    scanf("%d", &T);
    while (T -- ) solve();
    return 0;
}

标签:lfloor,frac,分块,数论,sum,mid,rfloor,bigg
From: https://www.cnblogs.com/YipChipqwq/p/18471043

相关文章

  • 蓝桥杯数论通关系列(四)拓展欧几里得算法
    一.贝祖等式给定a,b均为整数,一定存在一组整数x,y使得a,b满足a*x+b*y=gcd(a,b)=c。而拓展欧几里得算法就是求出这组整数(x,y)的算法。二.拓展欧几里得算法首先先回顾一下欧几里得算法,欧几里得算法是计算两个数最大公因数的计算方法,如果要求gcd(a,b)的话,可以不断将其变为gcd(......
  • LOJ 数列分块入门2
    算法考虑求小于给定值的数的个数,可以给每个块再维护一个已经排好序的数组,整块加法对于这个块排好序的数组没有影响,零散块加法直接在原序列上加,再将零散块所处的整块从新排序。查询时零散块暴力查找,整块二分查找代码#include<bits/stdc++.h>#defineintlonglongconstintM......
  • 【JS】requestIdleCallback实现分块执行
    点击按钮后,执行一个耗时较长的dom操作,页面很长时间没有响应,给用户一种卡死的现象<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0">&......
  • 笔记——数论
    蓝月の笔记——数论篇Part0约定令\(\mathcal{P}\)为质数的集合所有时间复杂度均指上界Part1质数,\(\gcd\)质数就是只有\(1\)和本身两个因数的数,公因数就是同时使多个数的因数的数,\(\gcd\)就是最大的公因数质数求法:欧拉筛在埃氏筛的基础上优化,让每个合数都只被一个......
  • 张量矩阵乘法分块乘法概述
    张量矩阵乘法分块乘法概述介绍一下矩阵计算相关的内容,从最基本的算法,到Cutlass这些线性代数模版库,特别是Layout代数相关的内容,再逐渐细化到一些硬件实现访存优化和一些算子融合。6.3.1GEMM概述1.GEMM定义对于一个矩阵乘法,定义如下: (6-1)一个矩阵乘法定义,如图6-26......
  • 矩阵分块乘法
    矩阵分块乘法通常可以把一个矩阵分成多个块,例如, (6-4)可以将其划分为4个块:   (6-5)   (6-6)分块后的矩阵记为:(6-7)分块矩阵乘法如下所示:(6-7)划分不一定需要完全等间隔,只需要满足子矩阵乘法规则即可,如图6-27所示。图6-27子矩阵划分不一定需要完全......
  • [Violet] 蒲公英(分块)
    区间众数要求即有次数又要数字最小#include<bits/stdc++.h>usingnamespacestd;#definexfirst#defineysecondtypedefpair<int,int>PII;typedeflonglongll;typedefunsignedlonglongull;typedefunsignedintuint;typedefvector<string>VS;typedef......
  • Python数论应用
    引言        在前面的课程中,我们已经学习了Python的基本输入输出、数据类型及其转换、顺序结构、分支结构、循环结构、循环控制语句、字符串类型、列表类型、元组类型、字典类型、集合类型、函数的定义与使用、函数调用与作用域、函数的高级应用、质数、倍数与余数......
  • 分块/莫队学习笔记(一)(2024.8.23)
    分块基本概念分块的基本思想是,通过对原数据的适当划分,并在划分后的每一个块上预处理部分信息,从而较一般的暴力算法取得更优的时间复杂度。分块的时间复杂度主要取决于分块的块长,一般可以通过均值不等式求出某个问题下的最优块长,以及相应的时间复杂度。LOJ小分块#6277.数列分......
  • 数论学习笔记(一)(2024.7.25)
    一、最大公约数定义不全为\(0\)的整数\(a,b\)的最大公约数是指能够同时整除\(a\)和\(b\)的最大整数。欧几里得算法(gcd)gcd是用来求解两个整数的最大公约数定理1.2.1对于整数\(a,b,m,n\),若\(c\mida,c\midb\),则\(c\mid(ma+nb)\)证:\(\becausec\mida......