对于1~n中所有跟n互质的数的个数问题,我们会用欧拉函数来解决。
在开始讲欧拉函数之前,需要先了解质因数分解,传送门:http://t.csdn.cn/tqzvO。ok现在正式开始欧拉函数的推导。
以上就是欧拉函数的推导过程啦(图源来自acwing),推导结束就可以根据结论进行代码实现了。
代码实现:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
ll t;
cin>>t;
while(t--)
{
ll n,ans;//开long long很多题目都会爆int
cin>>n;
ans=n;
for(int i=2;i<=n/i;i++)
if(n%i==0)
{
ans=ans/i*(i-1);//按公式计算,防止出现小数的情况,对公式进行了变形
while(n%i==0) n/=i;//因质数去重
}
if(n>1) ans=ans/n*(n-1);//循环结束后若n>1还需要计算
cout<<ans<<endl;
}
return 0;
}
找道题来验证一下:
结果无误。