题意:为求不大于N并与N互质的正整数的个数。我们把这样的两个正整数称为是互质的:当且仅当它们的最大公约数为1。
欧拉函数:
#include <cstdio>
#include <cstring>
using namespace std;
const int maxisp = 1000 + 10;
const int maxp = 500 + 10;
int num,n;
int prime[maxp];
int isprime[maxisp];
inline void get_prime()
{
num=0;
for(int i=2;i<=maxisp;i++)
if(!isprime[i])
{
prime[num++]=i;
for(int j=1;j*i<=maxisp;j++)
isprime[i*j]=1;
}
}
inline int euler(int x)
{
int res=x;
for(int i=0;i<num&&prime[i]*prime[i]<=x;i++)
{
if(x%prime[i]==0)
{
res=res/prime[i]*(prime[i]-1);
while(x%prime[i]==0)
x/=prime[i];
}
}
if(x>1) res=res/x*(x-1);
return res;
}
int main()
{
get_prime();
while(~scanf("%d",&n))
{
if(n==1) printf("1\n");
else printf("%d\n",euler(n));
}
return 0;
}
#include <cstdio>
#include <cstring>
using namespace std;
inline int gcd(int a,int b)
{
return b?gcd(b,a%b):a;
}
int main()
{
int n;
while(~scanf("%d",&n))
{
int ans=0;
for(int i=1;i<=n;i++)
if(gcd(n,i)==1)ans++;
printf("%d\n",ans);
}
}

本文介绍了两种算法:一种使用欧拉函数快速计算不大于N并与N互质的正整数个数;另一种通过最大公约数(GCD)模拟逐个检查的方法实现相同目的。文中提供了完整的C++代码实现。

185

被折叠的 条评论
为什么被折叠?



