基础数论 整除分块与欧拉函数
整除分块:#
例题:#
已知
固然可以
计算一下前几项的值之后可以发现
先让
为区间的左端点,那么这块的值都为 , 。将 代入,得到 。这样每一块的左右端点都能用确定的式子得到了。这样分块的值就为单值 区间长度,即 。
模板:#
代码
ll division_block(ll n){
ll res = 0;
for(ll l = 1, r; l <= n; l = r + 1){
r = n / (n / l);
res += n / l * (r - l + 1);
}
return res;
}
欧拉函数:#
定义:#
欧拉函数是指
即
特别的
性质:#
1.若
质数除了他本身都与他互质。
2.
因为
,所以与 不互质的数 成对出现,平均值为 ,所以与 互质的数的平均值也是 ,而这样的数共有 个,故得性质2。
3.若
发现所有
的倍数都与 不互质,其他数都与 互质,而 的倍数共有 个(包括 )。 故
4.若
如果
与 互质 , 与 互质 , 与 互质 ,则 与数对 是一一对应的。 符合条件的
有 种, 有 种, 则所对应的 数对有 种。而符合条件的 有 种。 所以
5.对于一正整数
证明:
6.若
7.若质数
设
即
代码:#
1.求解单个欧拉函数:利用性质
代码
int phi(int n) {
int ans = n;
int t = sqrt(n);
for(int i=2; i<=t; ++i) {
if(n%i == 0)
ans = ans/i*(i-1);
while(n%i == 0) n /= i;
}
if(n > 1) ans = ans/n/(n-1);
return ans;
}
- 埃氏筛求
的欧拉函数值,时间复杂度
代码
void found_euler(int n) {
for(int i=1; i<=n; ++i) phi[i] = i;
for(int i=2; i<=n; ++i) {
if(phi[i] == i) { // i为质数
for(int j=i; j<=n; j+=i) // 给包含质因子i的数字,乘上 (1-1/i)
phi[j] = phi[j]/i*(i-1);
}
}
}
3.欧拉筛求
代码
int phi[N],pr[N],cnt;
bool vis[N];
void init(){
int n=1e5+50;
phi[1]=1;
for(int i=2;i<=n;i++){
if(!vis[i]){pr[++cnt]=i,phi[i]=i-1;}
for(int j=1;j<=cnt&&pr[j]<=n/i;j++){
vis[i*pr[j]]=1;
phi[i*pr[j]]=phi[i]*((i%pr[j])?pr[j]-1:pr[j]);
if(i%pr[j]==0)break;
}
}
}
GCD SUM#
求
原式可化为
GCD:#
给定正整数
Longge 的问题#
求
by ysx
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战