一、题目
二、分析思路
互质数个数很典型的可以想到用欧拉函数来求解
这里分享一篇详细介绍欧拉函数的文章:互质与欧拉函数 - JustinRochester - 博客园 (cnblogs.com)
三、代码实现
3.1、C++实现
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
//欧拉函数,求小于n的数中与n互质的数的个数
ll euler(int n) {
int res = n;
for (int i = 2; i * i <= 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(){
int n;
cin>>n;
ll ans = 0;
while(n>1)
{
ans += euler(n);
n--;
}
cout<<ans;
return 0;
}
这里注意如果定义ans为int,无法通过其中一个很大的测试用例,需要改成long long才够
四、总结
- 有些题目单纯靠自己来硬想,就算想出来了,可能也是非常拙劣的思路,有时我们还是需要站在巨人的肩膀上领会他们出神入化的思路和技巧,向他们学习
⭐如有不足之处,请多指教!⭐