https://www.cnblogs.com/flipped/p/5324598.html 链接
欧拉函数就是
ϕ(n)=不超过n且与n互素的正整数的个数
ϕ
(
n
)
=
不
超
过
n
且
与
n
互
素
的
正
整
数
的
个
数
,
欧拉函数是乘(积)性函数,所以对于两个任意互素的n,m都存在
f(n∗m)=f(n)∗f(m)
f
(
n
∗
m
)
=
f
(
n
)
∗
f
(
m
)
(乘性函数性质)。(对于任意正整数n,m都存在
f(n∗m)==f(n)∗f(m)
f
(
n
∗
m
)
==
f
(
n
)
∗
f
(
m
)
,就是完全乘性函数)
poj3090
https://blog.csdn.net/zhang20072844/article/details/8108727
给定一个坐标系,当从
(0,0)
(
0
,
0
)
到$$(x,y)的直线不经过任何点时,称$(x,y)$是可见的,给定一个n*n大小的区域,$0<=x<=n,0<=y<=n$问有多少点是可见的。
发现经过的点满足(x/k,y/k),那么当x,y互质时,就可以不经过其他点。
但是斜率为1时是例外(自己和自己肯定不互质)。所以要加上
#include <iostream>
#include <cstdio>
using namespace std;
/*
*/
const int maxn=1e6+5;
int euler(int n){ //返回euler(n)
int res=n,a=n;
for(int i=2;i*i<=a;i++){
if(a%i==0){
res=res/i*(i-1);//先进行除法是为了防止中间数据的溢出
while(a%i==0) a/=i;
}
}
if(a>1) res=res/a*(a-1);
return res;
}
int phi_get(int n){
int rea=n;
for(int i=2;i<=n;i++){
if(n%i==0){
rea-=rea/i;
do n/=i;
while (n%i==0);
}
}
return rea;
}
long long phi[maxn];
int db_phi(){
for(int i=1;i<maxn;i++)
phi[i]=i;
for(int i=2;i<maxn;i+=2)
phi[i]/=2;
for(int i=3;i<maxn;i+=2)
if(phi[i]==i){
for(int j=i;j<maxn;j+=i){
phi[j]=phi[j]/(i)*(i-1);
}
}
return 0;
}
int main(){
int n;
db_phi();
for(int i=2;i<maxn;i++)
phi[i]+=phi[i-1];
int tim=1;
int t;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
printf("%d %d %lld\n",tim++,n,phi[n]*2+1);
}
return 0;
}