模板总结归纳:
实战模板题 :HDU 1286 找新朋友
const int Max = 111111;
int minDiv[Max], phi[Max], sum[Max];
void genPhi(){
for(int i = 1; i < Max; i++){
minDiv[i] = i;
}
for(int i = 2; i * i < Max; ++i){
if(minDiv[i] == i){
for(int j = i * i; j < Max; j += i){
minDiv[j] = i;
}
}
}
phi[1] = 1;
for(int i = 2; i < Max; i++){
phi[i] = phi[i / minDiv[i]];
if((i / minDiv[i]) % minDiv[i] == 0){
phi[i] *= minDiv[i];
}else{
phi[i] *= minDiv[i] - 1;
}
}
}
实战模板题 :HDU 1286 找新朋友
#include<iostream>
using namespace std;
const int Max = 111111;
int minDiv[Max], phi[Max], sum[Max];
void genPhi(){
for(int i = 1; i < Max; i++){
minDiv[i] = i;
}
for(int i = 2; i * i < Max; ++i){
if(minDiv[i] == i){
for(int j = i * i; j < Max; j += i){
minDiv[j] = i;
}
}
}
phi[1] = 1;
for(int i = 2; i < Max; i++){
phi[i] = phi[i / minDiv[i]];
if((i / minDiv[i]) % minDiv[i] == 0){
phi[i] *= minDiv[i];
}else{
phi[i] *= minDiv[i] - 1;
}
}
}
int main()
{
int t, temp;
cin >> t;
genPhi();
while(t--){
cin >> temp;
cout << phi[temp] << endl;
}
return 0;
}