题目链接:http://codeforces.com/contest/1512/problem/G
大意:定义表示n的所有因子和。给定正整数c,求满足
的最小的n
思路:先预处理出内数的
,采用埃氏筛可以在
的时间内处理出来。
因为c的范围是在内的,所有遍历1-1e7内的数,然后用数组记录最先出现
的位置,因为我们要求的是最小的n。
Code
#include <bits/stdc++.h>
#define ll long long
#define pir pair<int,int>
#define pirl pair<ll,ll>
#define debug(x) cout << #x << ":" << x << '\n'
const int N = 1e7+7;
const ll mod = 998244353;
const ll ds = 1e18;
const double eps = 1e-8;
ll read(){ll x=0,f=1;char c=getchar(); while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();} while(c>='0'&&c<='9') x=(x<<1)+(x<<3)+c-'0',c=getchar(); return f*x;}
void print(ll x){ if(x < 0) {putchar('-');x = -x;} if(x/10) print(x/10); putchar(x%10+'0'); }
using namespace std;
int num[N];
vector<int>a[N];
void init(){
for(int i = 1; i <= 10000000; i++){
for(int j = i; j <= 10000000; j += i){
num[j] += i;
}
}
for(int i = 1; i <= 10000000; i++){
if(num[i] > 10000000) continue;
if(a[num[i]].size() == 0) a[num[i]].push_back(i);
}
}
void solve(){
int c;
scanf("%d",&c);
if(a[c].size() == 0){
puts("-1");
return;
}
printf("%d\n",a[c][0]);
}
int main(){
int t;
init();
cin >> t;
while(t--)
solve();
//system("pause");
return 0;
}