【蓝桥杯】 试题 算法提高 欧拉函数 (模板 欧拉函数公式求互质)

问题描述

老师出了一道难题,小酱不会做,请你编个程序帮帮他,奖金一瓶酱油:
  从1—n中有多少个数与n互质?
  |||||╭══╮ ┌═════┐
  ╭╯让路║═║酱油专用车║
  ╰⊙═⊙╯ └══⊙═⊙═(坑爹的题面格式化,害得我用‘|’来代替空格,复制到记事本上看就变成正版的了)
输入格式
  输入共一行,表示一个整数n。
输出格式
  输出共一行,表示从1—n中与n互质的数的个数。

样例输入

30

样例输出

8

数据规模和约定

60%的数据≤10^6
  100%的数据≤2*10^9


【蓝桥杯】 试题 算法提高 欧拉函数 (模板 欧拉函数公式求互质)_第1张图片


代码:

#include 
#include 
using namespace std; 
typedef long long ll;
int main()
{
     
	ll n;
	cin>>n;
	ll ans=n;
	for(int i=2;i*i<=n;i++) //分解质因数 
	{
     
		if(n%i==0)
		{
     
			ans=ans/i*(i-1); 
	//根据欧拉函数通式,每种质因数只算一次,因为 i 是n的质因数,
	//所以一定能整除,先整除防止数过大 
			while(n%i==0)	n/=i; //可能有多个相同质因数 
		}
		if(n==1) break;
	}	
	if(n!=1) ans=ans/n*(n-1); //本身为素数 	
	cout<<ans;
    return 0;
}

你可能感兴趣的:(蓝桥杯,算法,c++,蓝桥杯,欧拉函数)