当前位置: 首页 > news >正文

整除分块

问题引入

∑ i = 1 k ⌊ n i ⌋ , n ≤ 1 0 14 \sum_{i=1}^k⌊\frac{n}{i}⌋,n \leq 10^{14} i=1kin,n1014

等价定义

d ( x ) d(x) d(x) x x x的因子个数,则上述问题等价于 ∑ i = 1 k d ( i ) \sum_{i=1}^kd(i) i=1kd(i)

又根据因数个数定理,设 x x x的质因数分解式为 x = P 1 a 1 ∗ P 2 a 2 ∗ . . . ∗ P n a n x=P_1^{a_1} *P_2^{a_2}*...*P_n^{a_n} x=P1a1P2a2...Pnan,令 g ( x ) = ( a 1 + 1 ) ∗ ( a 2 + 1 ) . . . ( a n + 1 ) g(x)=(a_1+1)*(a_2+1)...(a_n+1) g(x)=(a1+1)(a2+1)...(an+1),那么也等价于 ∑ i = 1 k g ( i ) \sum_{i=1}^kg(i) i=1kg(i)

若范围较小, ∑ i = 1 t d ( i ) \sum_{i=1}^td(i) i=1td(i)可以线性筛预处理,原理是: d ( i ) d(i) d(i)是积性函数

欧拉筛时每个数只由它最小的质因子筛出,那么我们使用数组 a a a记录每个数最小质因子的幂次, d d d记录每个数的因子个数。当遇到质数时,显然 a [ i ] = 1 , d [ i ] = 2 a[i]=1,d[i]=2 a[i]=1,d[i]=2;当 i % p ! = 0 i\%p!=0 i%p!=0时,证明 i ∗ p i*p ip的最小质因子为 p p p i ⊥ p i\bot p ip,而 i i i的因子个数已经求出,那么 d [ i ∗ p ] = d [ i ] ∗ 2 , a [ i ] = 1 d[i*p]=d[i]*2,a[i]=1 d[ip]=d[i]2,a[i]=1;当 i % p = = 0 i\%p==0 i%p==0时,显然我们只需要修改答案中 p p p的乘积因子,即由原来的 a [ i ] + 1 → a [ i ] + 2 a[i]+1 \rightarrow a[i]+2 a[i]+1a[i]+2 a [ i ∗ p ] = a [ i ] + 1 a[i*p]=a[i]+1 a[ip]=a[i]+1

代码

ll d[maxn];
vector<int> prime;
bitset<maxn> vis;

void init() {
    d[1] = 1;
    for (int i = 2; i < maxn; i++) {
        if (!vis[i]) {
            prime.push_back(i);
            d[i] = 2, a[i] = 1;
        }
        for (int j = 0; j < prime.size() && i * prime[j] < maxn; j++) {
            vis[i * prime[j]] = 1;
            if (i % prime[j]) {
                d[i * prime[j]] = d[i] * 2;
                a[i * prime[j]] = 1;
            } else {
                d[i * prime[j]] = d[i] / (a[i] + 1) * (a[i] + 2);
                a[i * prime[j]] = a[i] + 1;
                break;
            }
        }
        d[i] += d[i - 1];
    }
}

分析

显然枚举会超时,因为有很多 ⌊ n i ⌋ ⌊\frac{n}{i}⌋ in是一样的,那么需要分块计算,即将相等的一部分一次求出。而且打表可以发现都是相同的 ⌊ n i ⌋ ⌊\frac{n}{i}⌋ in会连续出现

⌊ n j ⌋ ⌊\frac{n}{j}⌋ jn ⌊ n i ⌋ ⌊\frac{n}{i}⌋ in相等,则 j j j的最大值为 ⌊ n ⌊ n i ⌋ ⌋ ⌊\frac{n}{⌊\frac{n}{i}⌋}⌋ inn。根据这个结论,只需要设置两个变量 l , r l,r l,r,每次令 r = ⌊ n ⌊ n l ⌋ ⌋ r=⌊\frac{n}{⌊\frac{n}{l}⌋}⌋ r=lnn,一次计算出相同部分

因为 n n n以内的因数最多有 2 n 2\sqrt{n} 2n 种,那么时间复杂度为 O ( n ) O(\sqrt{n}) O(n )

代码

ll cal(ll n, ll k) {
    ll ans = 0;
    for (ll l = 1, r; l <= k; l = r + 1) {
        r = n / (n / l);
        if (r > k) r = k;
        ans += (n / l) * (r - l + 1);
    }
    return ans;
}

二维整除分块

∑ i = 1 m i n ( n , m ) ⌊ n i ⌋ ⌊ m i ⌋ \sum_{i=1}^{min(n,m)} \lfloor \frac{n}{i} \rfloor \lfloor \frac{m}{i} \rfloor i=1min(n,m)inim

ll cal(ll n, ll m) {
    ll ans = 0;
    ll up = min(n, m);
    for (ll l = 1, r; l <= up; l = r + 1) {
        r = min(n / (n / l), m / (m / l));
        if (r > up) r = up;
        //...
    }
    return ans;
}

相关文章:

  • 《程序员羊皮卷》飙升当当IT新书热卖榜第二名
  • 洛谷 P2261 [CQOI2007]余数求和(整除分块)
  • 如何定义一本好书——《程序员羊皮卷》书评(2)
  • Win32 OpenGL编程(10) 视口变换
  • SQL SERVER 的 CLR 存储过程
  • 有用的Oracle 管理工具 for windows助手
  • 现代软件构建系统的使用 CMake简介
  • 搜集的一些RTMP项目,有Server端也有Client端
  • .NET的数据绑定
  • 从员工、猎头到创业者的职场经验——《程序员羊皮卷》书
  • 完成从学习者到社会人的转变——《程序员羊皮卷》连载(14)
  • 百度全面放弃竞价排名的原因
  • Mobile Market如何能像淘宝网一样流行?
  • Ubuntu 9.10总算出来了
  • 《程序员羊皮卷》还未上市即告售罄的故事
  • #Java异常处理
  • [iOS]Core Data浅析一 -- 启用Core Data
  • E-HPC支持多队列管理和自动伸缩
  • ES6语法详解(一)
  • GitUp, 你不可错过的秀外慧中的git工具
  • Java多态
  • js面向对象
  • php ci框架整合银盛支付
  • TypeScript实现数据结构(一)栈,队列,链表
  • Windows Containers 大冒险: 容器网络
  • 包装类对象
  • 编写高质量JavaScript代码之并发
  • 构建二叉树进行数值数组的去重及优化
  • 京东美团研发面经
  • 如何胜任知名企业的商业数据分析师?
  • NLPIR智能语义技术让大数据挖掘更简单
  • 阿里云重庆大学大数据训练营落地分享
  • 积累各种好的链接
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • #Linux(权限管理)
  • #微信小程序:微信小程序常见的配置传旨
  • (2)nginx 安装、启停
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (TOJ2804)Even? Odd?
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (译) 函数式 JS #1:简介
  • .bat批处理出现中文乱码的情况
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
  • .NET/C# 的字符串暂存池
  • .sdf和.msp文件读取
  • ?.的用法
  • @Repository 注解
  • [ vulhub漏洞复现篇 ] Jetty WEB-INF 文件读取复现CVE-2021-34429
  • [ 云计算 | AWS ] AI 编程助手新势力 Amazon CodeWhisperer:优势功能及实用技巧
  • [AHOI2009]中国象棋 DP,递推,组合数