欧拉函数
适用范围:求与一个或者连续几个数互质的数的个数,也可以反过来求与其不互质的书的个数。
PS:信欧拉,得永生。
PS:第二段的代码我还没调好各位先别用。
std.cpp(求单个数)
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<iomanip>
#include<algorithm>
#include<string>
#include<cstring>
#include<queue>
using namespace std;
//求所有与该数互质的数的个数
int getphi(int n)
{
int m=sqrt(n+0.5);
int ans=n;
for(int i=2;i<=m;i++)
if(n%i==0)
{
ans = ans/i*(i-1);
while(n%i==0)
n/=i;
}
if(n>1)ans=ans/n*(n-1);
return ans;
}
int main()
{
int n;
cin >> n; cout << getphi(n) << endl;
}
std.cpp(求1~n)
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<iomanip>
#include<algorithm>
#include<string>
#include<cstring>
#include<queue>
using namespace std;
//求所有与该数互质的数的个数
int tot=0,phi[10000007],prime[10000007];
bool check[10000007];
void euler(int n)
{
memset(check,false,sizeof check);
phi[1] = 1;
for(int i=2;i<=n;i++)
{
if(!check[i])
{
prime[tot++] = i;
phi[i] = i-1;
}
for(int j=0;j<tot;j++)
{
if(i*phi[i]>n) break;
check[i*phi[i]] = 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);
}
}
}
int main()
{
int n;
cin >> n;
euler(n);
for(int i=1;i<=n;i++)cout<<phi[i]<<endl;
}