https://codeforces.com/contest/1512/problem/G
没观察出一个数的因数和是大于他本身的,主要还是因为E题卡着没看G
最简单的方法是调和级数直接求因数和
不过也可以积性函数线性筛搞,因为假设两个x,y,gcd(x,y)=1,说明x*y中x的所有因数和y的所有因数任意组合都不会有重复,所以d(x)*d(y)=d(xy)
这种求积性函数的就只要在线性筛的时候记录一下最小质因数和最小质因数的幂次或者值是多少就行了
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxl=1e7+10;
int n,c,k,cnt,tot,cas,ans;
ll a[maxl],d[maxl],mip[maxl],mippro[maxl],p[maxl];
bool no[maxl];
char s[maxl];
inline void shai()
{
d[1]=1;
for(int i=2;i<maxl;i++)
{
if(!no[i])
p[++p[0]]=i,mip[i]=i,d[i]=i+1,mippro[i]=i;
int j=1,t=p[1]*i;
while(j<=p[0] && t<maxl)
{
no[t]=true;mip[t]=p[j];
if(mip[t/p[j]]==p[j])
{
mippro[t]=mippro[t/p[j]]*p[j];
if(mippro[t]==t)
d[t]=d[t/p[j]]+t;
else
d[t]=d[t/mippro[t]]*d[mippro[t]];
}
else
{
mippro[t]=p[j];
d[t]=d[t/p[j]]*d[p[j]];
}
if(i%p[j]==0)
break;
t=p[++j]*i;
}
}
memset(a,-1,sizeof(a));
for(int i=1;i<maxl;i++)
if(d[i]<maxl && a[d[i]]==-1)
a[d[i]]=i;
}
inline void prework()
{
scanf("%d",&c);
printf("%lld\n",a[c]);
}
inline void mainwork()
{
}
inline void print()
{
}
int main()
{
shai();
int t=1;
scanf("%d",&t);
for(cas=1;cas<=t;cas++)
{
prework();
mainwork();
print();
}
return 0;
}