题解 P4388 【付公主的矩形】
逆向思考,考虑对于一组
发现问题在
可以得到一般情况,
注意到此时每一个数两边都必须是
的解。
记
即
答案即为
等等,因为要对对称的去重,所以再对这个结果 +1 除以 2 。因为
通过欧拉筛法,此题可以以
#include <cstdio>
using namespace std;
const int N = 1000010;
int n, pc, ans;
bool vis[N];
int p[N], phi[N];
int main() {
scanf("%d", &n);
for (int x = 2; x <= n + 1; ++x) {
if (!vis[x]) {
p[++pc] = x;
phi[x] = x - 1;
}
if (n % (x - 1) == 0)
ans += phi[x];
for (int i = 1; x * p[i] <= n + 1; ++i) {
vis[x * p[i]] = true;
if (x % p[i] == 0) {
phi[x * p[i]] = phi[x] * p[i];
break;
} else {
phi[x * p[i]] = phi[x] * phi[p[i]];
}
}
}
printf("%d\n", (ans + 1) / 2);
return 0;
}