Codeforces Round #713(Div. 3)
G. Short Task
题意:我们先定义d(n) = n的所有因子之和,给定一个数c( 1 < = c < = 1 e 7 1<=c<=1e7 1<=c<=1e7),要求寻找最小的n满足d(n) = c
思路:预处理+打表,对于每个是i的倍数的数我们都要加上i,所以我们开个sum[ ]记录每个数的 d ( n ) d(n) d(n),然后再打个表记录一下第一次出现 d ( n ) d(n) d(n)时的n即可
Code:
#include <bits/stdc++.h>
#define int long long
#define ios ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)
using namespace std;
const int mxn=1e7+5;
int sum[mxn];
int ans[mxn];
void pre(){
for(int i=1; i<mxn; i++) ans[i]=-1;
for(int i=1; i<mxn; i++){
int num=i;
while(num<mxn){
sum[num]+=i;
num+=i;
}
}
for(int i=1; i<mxn; i++){
if(sum[i]<mxn&&ans[sum[i]]==-1){
ans[sum[i]]=i;
}
}
}
signed main(){
ios;
pre();
int t=1;
cin>>t;
while(t--){
int n;
cin>>n;
cout<<ans[n]<<'\n';
}
return 0;
}