线性筛 模板
直接Copy好了
// 欧拉函数 phi(n) = n * π(1-1/p) ,p为n的质因数 // phi(m*n) = phi(m) * phi(n),nm互质 // phi(i*p) = p*phi(i) ,当i mod p == 0 const int N = 3e6+5; bool vis[N]; int cnt,prime[N],phi[N]; // 线性筛求素 void Prime() { vis[0] = vis[1] =1; for(int i=2; i<N; i++) { if(vis[i] == 0) { prime[cnt++] = i; } for(int j=0; j<cnt && prime[j]*i <N; j++) { vis[i*prime[j]] = 1; if(i%prime[j] == 0) break; } } } //欧拉函数 void Eula() { phi[1] = 1; for(int i=2; i<N; i++) { if(vis[i] ==0) { prime[cnt++] = i; phi[i] = i-1; } for(int j=0; j<cnt && prime[j]*i<N; j++) { vis[i*prime[j]] = 1; // i mod prime[j] == 0, phi[i*prime[j]] = phi[i] * prime[j] if(i%prime[j] ==0) { // i -> k * prime[j] phi[i*prime[j]] = phi[i] * prime[j]; break; }else { //phi(m*n) = phi(m)*phi(n) prime[j]为素数,因此phi[prime[j]] = prime[j] -1; phi[i*prime[j]] = phi[i] *(prime[j]-1); } } } }