![[hgoi#2019/2/17t1]million [hgoi#2019/2/17t1]million](https://image.shishitao.com:8440/aHR0cHM6Ly9ia3FzaW1nLmlrYWZhbi5jb20vdXBsb2FkL2NoYXRncHQtcy5wbmc%2FIQ%3D%3D.png?!?w=700&webp=1)
题目描述
面对格鲁的入侵,小黄人们要组建一支队伍,来抵御进攻,现在有编号为1 至n 的小黄人,任命编号为n 的队长,由其挑选队员,当然编号不是随便编的,每一个编号里都包含一个小黄人的个人信息,现在队长要挑选一些与自己有共同语言(两者编号的最大公约数大于1)的小黄人组建队伍,现在给出n,请你计算出队伍中最多可以有多少的小黄人。
样例输入
4
样例输出
2
题目大意
求出在\(1\)~\(n\)中有多少个数和\(n\)不互质。
解法
欧拉函数,直接暴力求解有多少个数和\(n\)互质,再拿\(n\)减去得到答案。
ac代码
#include<bits/stdc++.h>
#define LL long long
using namespace std;
LL n;
LL read(){
LL w=0,x=0;char ch=0;
while(!isdigit(ch))w|=ch=='-',ch=getchar();
while(isdigit(ch))x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
return w?-x:x;
}
LL euler(LL n){//欧拉函数直接求[1,n]中有多少个数和n互质
LL res=n;
for(LL i=2;i<=sqrt(n);i++){
if(n%i==0){
res=res/i*(i-1);
while(n%i==0) n/=i;
}
}
if(n>1)res=res/n*(n-1);
return res;
}
int main(){
n=read();
printf("%lld\n",n-euler(n));
return 0;
}