若在算数基本定理中,N=p1a1p2a2…pnan,则ϕ(N)= N *
p
1
−
1
p
1
\frac{p1-1}{p1}
p1p1−1 *
p
2
−
1
p
2
\frac{p2-1}{p2}
p2p2−1 * … *
p
n
−
n
p
n
\frac{pn-n}{pn}
pnpn−n。
#include<iostream>usingnamespace std;int n;intoula(int a)//欧拉函数{int res = a;for(int i =2; i <= a / i; i++)//因为大于a的平方根的质数p只可能有1个,所以i不用循环到a{if(a % i)continue;while(a % i ==0)a /= i;
res = res / i *(i -1);}if(a >1)res = res / a *(a -1);//若此时a>1,则a就是那个大于原来a的平方根的质数p(唯一)return res;}intmain(){
cin >> n;while(n--){int a;
cin >> a;
cout <<oula(a)<< endl;}return0;}
若i % primes[j] == 0,ϕ(i*primes[j]) = primes[j] * ϕ(i)(因为此时i * primes[j]的质因数与i完全一致,对应于欧拉函数定义ϕ(N)= N *
p
1
−
1
p
1
\frac{p1-1}{p1}
p1p1−1 *
p
2
−
1
p
2
\frac{p2-1}{p2}
p2p2−1 * … *
p
n
−
n
p
n
\frac{pn-n}{pn}
pnpn−n,只有N大primes[j]倍)
若i % primes[j] != 0,ϕ(i*primes[j]) = primes[j] * ϕ(i) *
p
r
i
m
e
s
[
j
]
−
1
p
r
i
m
e
s
[
j
]
\frac{primes[j]-1}{primes[j]}
primes[j]primes[j]−1 = (primes[j]-1) * ϕ(i)(因为此时N大了primes[j]倍,质数多了一个pirmes[j])
#include<iostream>usingnamespace std;typedeflonglong LL;constint N =1e6+5;int primes[N], phi[N], cnt, n;bool st[N];
LL eulers(int n){for(int i =2; i <= n; i++){if(!st[i]){
phi[i]= i -1;
primes[cnt++]= i;}for(int j =0; i * primes[j]<= n; j++){
st[i * primes[j]]=true;if(i % primes[j]==0){
phi[i * primes[j]]= primes[j]* phi[i];break;}
phi[i * primes[j]]=(primes[j]-1)* phi[i];}}
LL res =1;for(int i =2; i <= n; i++)
res += phi[i];return res;}intmain(){
cin >> n;
cout <<eulers(n);return0;}
#include<iostream>usingnamespace std;constint mod =1e9+7;intslow(int a,int k){int res =0;while(k){if(k &1)res =(res + a)% mod;
k >>=1;
a =2* a % mod;}return res;}intmain(){int a, b;
cin >> a >> b;
cout <<slow(a, b);return0;}