资源限制
内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s
互质数个数
问题描述
已知正整数x,求1~x-1中,有多少与x互质的数。(互质是指两个数最大公约数为1)
输入格式
输入一行包括一个正整数x
输出格式
共一行,只有一个整数,表示与x互质数的个数
样例输入
12
样例输出
4
数据规模和约定
x<=10^8
样例说明
有1,5,7,11四个数与12互质。
法一:试除法
#include<iostream>
using namespace std;
int main(){
int n;
cin>>n;
long long res=n;
for(int i=2;i<=n/i;i++){
if(n%i==0){
res=res*(i-1)/i;
while(n%i==0){//除干净
n/=i;
}
}
}
if(n>1) res=res*(n-1)/n;
cout<<res<<endl;
}
注意: 题目中输入的n<=10^8,因此在计算的过程中可能超出int范围,所以用long long类型。
法二:线性筛法,但运行错误,因为N过大
#include<iostream>
using namespace std;
const int N=1e8+10;
int p[N],vis[N],phi[N];
int cnt;
int main(){
int n;
cin>>n;
phi[1]=1;
for(int i=2;i<=n;i++){
if(!vis[i]){
p[cnt++]=i;
phi[i]=i-1;
}
for(int j=0;i*p[j]<=n;j++){
int m=i*p[j];
vis[m]=1;
if(i%p[j]==0){
phi[m]=p[j]*phi[i];
break;
}else{
phi[m]=(p[j]-1)*phi[i];
}
}
}
cout<<phi[n];
return 0;
}