欲买桂花同载酒,终不似,少年游。|

xuchuhan

园龄:11个月粉丝:0关注:0

整除分块学习笔记

搬运自我的洛谷文章整除分块学习笔记

前言

本文是作者学习整除分块后的一些心得,可能有所不足,如有错误,望读者指正。

分块技巧

本文以求解问题:

i=1nni

为例讲述整除分块。

易知当 ni=dn,d 一定时,i 的取值范围是一段连续的区间,记作 [L,R]

假设 L 一定,如何快速求出 R 呢?

nL=d,求最大的 Δ,此时 R=L+ΔnL=nL+Δ=d

将两个式子化为整式可得 Ld+r1=(L+Δ)d+r2=n,其中 0r1,r2<d。两式相减得 Δd=r1r2

Δd=r1r2

r2=r1Δd

r20

r1Δd

Δr1d

r1=nmodL=nL×nL,d=nL

ΔnL×nLnL

Δmax=nL×nLnL=nnLL

R=L+Δmax=nnL

然后 L 的初始值从 1 开始,R 根据 L 推导,接着之后的 L=R+1

显然当 LnL 有 不超过n 种取值,当 L>nnL 不超过有 n 种取值,所以 L 共有不超过 2n 种取值,加上 L,R 的计算均为 O(1) 级别的,所以整个算法的时间复杂度就是 O(n),算是较为优秀的了。

P2261 [CQOI2007] 余数求和

简单推导即可:

G(n,k)=i=1nkmodi=n×ki=1ni×ki

用等差数列结合整除分块做即可。

code:

#include<bits/stdc++.h>
#define int unsigned long long
using namespace std;
int n,k,L=1,R,ans;
signed main(){
cin>>n>>k;
ans=n*k;
while(L<=n){
if(k/L>0)
R=min(k/(k/L),n);
else
R=n;
//求右端点
ans-=(R-L+1)*(L+R)/2*(k/L);
//等差数列
L=R+1;
}
cout<<ans;
return 0;
}

P6583 回首过去

非常有学习意义的一题。

考虑将 xy 转化为 b×ca×c,其中 a 只包含因数 2,5gcd(c,10)=1

我们考虑枚举合法的 c 并求出同样合法的 a,b 的情况数。

显然 c[1,n]gcd(10,c)=1 时,b[1,nc],而 a 则可以是 [1,nc] 中只含因数 2,5 的数,将所有合法的情况数记为 f(nc)

故总答案为 f(nc)×nc 乘上 c 的取值方案数。

n1012,显然,这个算法还是不够优秀。

等等,nc,这个不是整除分块吗?我们显然可以求出 [L,R] 使得 nL=nR=k,那么时间复杂度不就降至 n 级别了吗?

但是还有问题,我们无法直接通过 c%2!=0&&c%5!=0 判断 c 是否合法了。

那怎么办?通过容斥原理可以解决。

[L,R] 中合法的 c 可以这样计算:[L,R]1 的倍数 [L,R]2 的倍数 [L,R]5 的倍数 + [L,R]10 的倍数,记为 f([L,R])

但是这样的函数并不是很好求。但是将 f([L,R]) 换一种形式,变为 f([1,R])f([1,L]) 就可以通过除法直接求得了。

所以问题就迎刃而解了。

code

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,L=1,R,res;
int Cal_1(int range){//容斥求方案
return range-range/2-range/5+range/10;
}
int Cal_2(int x){//求出[1,x]中只含2,5因子的数的数量
int ans=0;
for(int i=1;i<=x;i*=2)
for(int j=i;j<=x;j*=5)
ans++;
return ans;
}
signed main(){
cin>>n;
while(L<=n){
int R=n/(n/L);
//整除分块基本操作:R=n/(n/L)
res+=(Cal_1(R)-Cal_1(L-1))*Cal_2(n/L)*(n/L);//计算答案
L=R+1;//跳至下一分块
}
cout<<res;
return 0;
}

本文作者:xuchuhan

本文链接:https://www.cnblogs.com/xch0730/p/18668274/number-theory-block

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   xuchuhan  阅读(9)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起