经过本蒟蒻的百般打表与观察,大致得出如下结论:
我们应该按照1~n每个数来分n个类。
我神奇地发现了欧拉函数十分有用。
欧拉函数:
由此,每一个数都可以来分类,而我们要找求的是三个数的最大公约数,所以我们应该在
的基础上再乘上
,于是再把他们加起来就可以了。
所以,code就是——
#include <bits/stdc++.h>
using namespace std;
int main() {
int n, ans = 0;
cin >> n;
for (int i = 1; i <= n; ++i) {
int t = i, i1 = i;
for (int j = 2; j * j <= i1; j++) {
if (i1 % j == 0) {
t = t / j * (j - 1);
while (i1 % j == 0) i1 /= j;
}
}
if (i1 > 1) t = t / i1 * (i1 - 1);
ans += t * (n / i) * (n / i) * (n / i);
}
cout << ans << endl;
return 0;
} 总的来说,时间复杂度降到了
总算低于啦!



京公网安备 11010502036488号