题面
有这样一个函数,函数的定义域为 (N^*),值域也是 (N^*),并且这个函数 (f(x)) 对任意正整数 (n) 满足:(sumlimits_{d|n}f(d)=n)
现在给你 (N) 个数,要求 (N) 个数的函数值和。
数据范围
(10%) 的数据,(N=3*10^7),(A_i=7)
另外两个数据分别为:
(N=5),(A_i={162614600673829、 1125897758834689、 222915410844073、 18004502351257601、 2001600073928249})
和:(N=3),(Ai={18014398241046527、 18014398777917439、 489133282872437279})
代码:
// 裸欧拉函数
// 这题主要传达的一个思想就是一个做法解决不了的部分可以搞成 SubTask 甚至于打表,
// 毕竟比赛的时候还是以得分为主的
# include <iostream>
# include <cstdio>
# define MAXN 10000005
template<typename T>void rd(T & x){
x = 0; T fl = 1;
int ch = getchar();
for( ;!isdigit(ch); ch = getchar()){
if(ch == '-'){
fl = -1;
}
}
for( ; isdigit(ch); ch = getchar()){
x = x * 10 + ch - '0';
}
x *= fl;
}
int phi[MAXN];
int main(){
int n;
rd<int>(n);
if(n == 3){
printf("525162079891401242");
}
else if(n == 5){
printf("21517525747423580");
}
else if(n == (int)3e7){
printf("180000000");
}
else{
for(int i = 1; i <= (int)1e7; i++){
phi[i] = i;
}
for(int i = 2; i <= (int)1e7; i++){
if(phi[i] == i){
for(int j = 1; i * j <= (int)1e7; j++){
phi[i*j] = phi[i*j] / i * (i-1);
}
}
}
long long ans = 0;
for(int i = 1, cur; i <= n; i++){
rd<int>(cur);
ans += phi[cur];
}
printf("%lld", ans);
}
return 0;
}
其实 ihp 就是 phi 反过来