尤拉函式和莫比烏斯函式的求法
阿新 • • 發佈:2019-01-08
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
typedef long long LL;
int phi[1000005],prime[1000005];
bool f[100005];
LL getphi(LL n) {
LL phi=n;
for (LL i=2;i*i<=n;i++) {
if (n%i==0) {
phi=phi/i*(i-1);
while (n%i==0) n/=i;
}
}
if (n>1) phi=phi/n*(n-1);
return phi;
}
int main() {
int n;
cin>>n;
cout<<getphi(n)<<endl;
phi[1]=1;
for (LL i=2;i<=n;i++) {
if (!f[i]) {
phi[i]=i-1;
prime[++prime[0]]=i;
}
for (int j=1;j<=prime[0];j++) {
if (i*prime[j]>n) break;
f[i*prime[j]]=1;
if (i%prime[j]==0) {
phi[i*prime[j]]=phi[i]*prime[j];
break;
}
else phi[i*prime[j]]=phi[i]*(prime[j]-1);
}
}
for (int i=1;i<=n;i++) cout<<phi[i]<<' ' ;cout<<endl;
return 0;
}
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
typedef long long LL;
int miu[1000005],prime[1000005];
bool f[100005];
LL getmiu(int n) {
int s=0;
for (LL i=2;i*i<=n;i++) {
if (n%i==0) {
s++;
int cnt=0;
while (n%i==0) n/=i,cnt++;
if (cnt>=2) return 0;
}
}
if (n>1) s++;
if (s&1) return 1;
else return 0;
}
int main() {
int n;
cin>>n;
cout<<getmiu(n)<<endl;
miu[1]=1;
for (LL i=2;i<=n;i++) {
if (!f[i]) {
miu[i]=-1;
prime[++prime[0]]=i;
}
for (int j=1;j<=prime[0];j++) {
if (i*prime[j]>n) break;
f[i*prime[j]]=1;
if (i%prime[j]==0) {
miu[i*prime[j]]=0;
break;
}
else miu[i*prime[j]]=-miu[i];
}
}
for (int i=1;i<=n;i++) cout<<miu[i]<<' ';cout<<endl;
return 0;
}