欧拉函数及拓展

求单个数的欧拉函数在这里插入图片描述

ll Get_phi(ll n){
	ll ans = n;
	for(ll i = 2; i <= sqrt(n) + 1; 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;
}

线性筛(同时得到欧拉函数和素数表)
代码

拓展
求[l,r]之间与n互质的数的个数(容斥原理)
转换:求[1, m]与n互质的个数
Ans = [1,r]与n互质的个数 - [1, l - 1]与n互质的个数

求解:
设n的质因数为 P 1 , P 2 , P 2 , . . . , P k P_1,P_2,P_2,...,P_k P1,P2,P2,...,Pk
设全集U = 区间[1,n]的所有数
集合 A 1 A_1 A1由U中是 P 1 P_1 P1倍数的数组成的
集合 A 2 A_2 A2由U中是 P 2 P_2 P2倍数的数组成的

集合 A k A_k Ak由U中是 P k P_k Pk倍数的数组成的
那么[1,m]与n互质的个数= ∣ U ∣ − ( ∣ A 1 ∣ + ∣ A 2 ∣ + . . . + ∣ A k ∣ ) + ( ∣ A 1 交 A 2 ∣ + ∣ A 1 交 A 3 + . . . ∣ ) |U|-(|A_1| +|A_2|+...+|A_k|) + (|A_1 交A_2| +|A1交A_3+...|) U(A1+A...+Ak)+(A1A2+A1A3+...)
具体就是奇数个组合减,偶数个组合加。
代码实现
首先先求出n的素数因子,然后用状压枚举(1- 2 k 2^k 2k

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值