时间复杂度不应该是 O(n) 的吗?
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int n, m;
ll ans;
int mu(int x) {
int y = 1;
for (int i = 2; i * i <= x; i++) {
if (x % i == 0) {
if (x % (i * i) == 0) return 0;
x /= i, y = -y;
}
}
if (x > 1) y = -y;
return y;
}
ll qpow(ll a, int b) {
ll c = 1;
while (b) {
if (b & 1) c *= a;
a *= a, b >>= 1;
}
return c;
}
int main() {
scanf("%d%d", &n, &m);
for (int i = 1; i * i <= m; i++) {
if (m % i == 0) {
ans += mu(i) * qpow(m / i, n);
if (i * i != m) ans += mu(m / i) * qpow(i, n);
}
}
printf("%lld\n", ans);
}