https://codeforces.com/contest/1512/problem/G
就是求这么一个式子,即一个数的因子和。对每个数进行暴力找因子求解的话肯定会T,这里有个巧妙的方法,如图:
//求1-n每个数的因子和
for (int i = 1; i <=n; i++)
for (int j = i; j <=n; j += i)
sum[j] += i;
因为因子就是能够整除的数,所以对于每个j来说,i一定是它的因子,那么我们枚举一遍i,对于每个i再枚举一遍它的倍数,累加起来就能求出1-n的因子和了,这样的时间复杂度nlogn,不会T。
接下来就很简单了,存一个答案数组记录下来即可,这里要注意题目要求的是最小值,所以我们只需要在对应的答案数组为0时更新一次即可。
#include <bits/stdc++.h>
using namespace std;
#define qc ios::sync_with_stdio(0)
#define ll long long
#define pb push_back
#define n 1000001
int sum[n];
int ans[n];
int main() {
qc, cin.tie(0);
for (int i = 1; i < n; i++)
for (int j = i; j < n; j += i)
sum[j] += i;
for (int i = 1; i < n; i++)
if (sum[i] < n)
if (ans[sum[i]] == 0)
ans[sum[i]] = i;
int t;
cin >> t;
while (t--) {
int x;
cin >> x;
if (ans[x] == 0)
ans[x] = -1;
cout << ans[x] << "\n";
}
}