rt 很疑惑
我整个代码都没用到a数组
可是为什么我定义了它就不会re呢?
已经排除越界 爆longlong等行为
只要把a数组定义那行注释掉 就会re,如果要ac取消掉注释就行 真是太神奇了
神奇神奇
#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
const int range=2e7+10;
long long MAXN=1e14+10000;
int n;
bool isprime[range];
int prime[range];
int a[range];
int cnt;
int g[range];
int f[range];
int ans[range];
void euler()
{
f[1]=g[1]=1;
ans[1]=1;
isprime[1]=1;
for(long long i=2;i*i<=MAXN;i++)
{
if(!isprime[i])
{
prime[++cnt]=i;
g[i]=f[i]=i+1;
ans[f[i]]=min(1LL*ans[f[i]],i);
}
for(long long j=1;j<=cnt&&1LL*prime[j]*i<=1LL*range;j++)
{
int m=i*prime[j];
isprime[m]=1;
if(i%prime[j]==0)
{
g[m]=g[i]*prime[j]+1;
f[m]=f[i]/g[i]*g[m];
ans[f[m]]=min(ans[f[m]],m);
break;
}
else {
g[m]=prime[j]+1;
f[m]=f[i]*g[m];
ans[f[m]]=min(ans[f[m]],m);
}
}
}
}
void solve(int t)
{
cin>>n;
if(ans[n]!=1e8)cout<<ans[n]<<endl;
else cout<<-1<<endl;
return ;
}
signed main()
{
ios::sync_with_stdio();
cin.tie(0);
cout.tie(0);
for(int i=1;i<=range;i++)ans[i]=1e8;
euler();
int t;
cin>>t;
for(int i=1;i<=t;i++) solve(i);
return 0;
}