-
题目
-
分析
裸的欧拉函数。
鉴于之前写到欧拉路径,这几天又忙于写简历(因为太菜,而不知道怎么凑够个人陈述的八九百字)。所以趁翘课的时候,写了这个裸的欧拉函数的题目。
老朋友是跟会长有公因数,不互质;那么新朋友就是跟会长互质。让你求互质的个数,就是欧拉函数的数值。
欧拉函数的讲解:
浅谈欧拉函数 有代码的
-
代码
//欧拉函数:求1-n-1里跟n互素的数个数
//欧拉函数值:φ(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…..(1-1/pn),
//其中p1, p2……pn为x的所有质因数,即既是x的因数又是质数
#include<iostream>
#include<algorithm>
#include<set>
#include<cstring>
#include<queue>
#include<stack>
#include<vector>
#include<map>
#include<stdio.h>
using namespace std;
#define ll long long
const int maxn=33000;
int euler[maxn];
void Getphi1()
{
euler[1]=1;
for(int i=2;i<maxn;i++)
{
euler[i]=i;
}
for(int i=2;i<maxn;i++)
{
if(euler[i]==i)
{
for(int j=i;j<maxn;j+=i)
euler[j]=euler[j]/i*(i-1);
}
}
}
int prime[maxn];
int flag[maxn];
int phi[maxn];
void Getphi2()
{
memset(flag,0,sizeof(flag));
phi[1]=1;
int num=0;
for(int i=2;i<maxn;i++)
{
if(flag[i]==0)
{
prime[++num]=i;
phi[i]=i-1;
}
for(int j=1; j<=num && prime[j]*i<maxn;j++)
{
flag[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]*phi[prime[j]];//积性函数
}
}
}
int main()
{
int cn;
cin>>cn;
Getphi2();
while(cn--)
{
int n;
cin>>n;
//是老朋友,不互质
//新朋友,小于N的质数的个数。 欧拉函数的数值
cout<<phi[n]<<endl;
}
return 0;
}