欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

欧拉函数及拓展

程序员文章站 2022-06-02 11:52:18
...

求单个数的欧拉函数欧拉函数及拓展

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的质因数为P1,P2,P2,...,PkP_1,P_2,P_2,...,P_k
设全集U = 区间[1,n]的所有数
集合A1A_1由U中是P1P_1倍数的数组成的
集合A2A_2由U中是P2P_2倍数的数组成的

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

相关标签: 2020寒假集训