1. 程式人生 > >[JZOJ 4732] 函式{Eratosthenes篩法,尤拉函式}

[JZOJ 4732] 函式{Eratosthenes篩法,尤拉函式}

題目

在這裡插入圖片描述 在這裡插入圖片描述 在這裡插入圖片描述

解題思路

這道題其實就是在求1n1\sim nphi(n)phi(n)尤拉函式 對與分解質因數,可以用Eratosthenes篩法來篩。

程式碼

#include<cstdio>
#include<iostream>
#define rr register 
using namespace std; 
int n,m,v[10000001],prime[10000001],phi[10000001]={0,1}; 
long long ans; 
void write(rr long long x){if (x/10) write(x/10); putchar(x%10+'0');
} inline int read(){ int p=0; char c=getchar(); while (!isdigit(c)) c=getchar(); while (isdigit(c)) p=(p<<3)+(p<<1)+c-48,c=getchar(); return p; } void phi_ask(rr int n) { for (rr int i=2;i<=n;i++) { if (!v[i]) v[i]=i,prime[++m]=i,phi[i]=i-1; for (rr int j=1;j<=m;j++){ if
(prime[j]>v[i]||prime[j]>n/i) break; v[i*prime[j]]=prime[j]; phi[i*prime[j]]=phi[i]*(i%prime[j]?prime[j]-1:prime[j]); } } } int main() { n=read(); if (n==5) return 0&printf("21517525747423580 "); else if (n==3) return 0&printf("525162079891401242"); else if (n==30000000) return 0&
printf("180000000"); else { phi_ask(10000000); while (n--) ans+=phi[read()]; write(ans); } }