题解:CF1731E Graph Cost
Priestess_SLG · · 题解
呃呃呃,大水题
首先有一个简单的贪心策略:先加边权大的边,然后再加边权小的边。容易证明她是正确的。
然后问题变为对于每一个
直接暴力计算
代码:
#include <bits/stdc++.h>
#define eb emplace_back
#define int long long
using namespace std;
const int N = 1000100;
int f[N];
signed main() {
int T;
cin >> T;
while (T--) {
int n, m;
cin >> n >> m;
for (int i = n; i; --i) {
f[i] = (n / i) * (n / i);
for (int j = 2; j * i <= n; ++j) {
f[i] -= f[j * i];
}
}
int sum = 0, cnt = 0;
for (int i = n; i > 1; --i) {
int k = min(m, f[i] / 2) / (i - 1) * (i - 1);
m -= k;
sum += k / (i - 1) * i;
}
if (m) {
sum = -1;
}
cout << sum << '\n';
}
return 0;
}