Solution:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ll long long
#define sc scanf
#define pf printf
#define pi 2*acos(0.0)
#define ft first
#define se second
#define Max 10001000
#define st(s) s.size();
#define r(input) freopen("input.txt","r",stdin)
#define w(output) freopen("output.txt","w",stdout)
#define maxall(v) *max_element(v.begin(),v.end())
#define minall(v) *min_element(v.begin(),v.end())
#define Sort(v) sort(v.begin(),v.end())
#define un(v) Sort(v), v.erase(unique(v.begin(),v.end()),v.end())
#define cover(a,d) memset(a,d,sizeof(a))
using namespace std;
bool prime[Max];
ll p[1000000],k=0;
void sieve()
{
ll i,j;
prime[1]=false;
for(i=2;i<=10001000;i++)
{
if(prime[i]!=false)
{
p[k++]=i;
for(j=i+i;j<=10001000;j+=i)
{
prime[j]=false;
}
}
}
}
int main()
{
cover(prime,true);
sieve();
ll n,i,j,a;
int c;
while(scanf("%lld",&n)==1)
{
if(n==0) break;
if(n<0) n*=-1;
for(i=0,c=0;i1&&p[i]<=n;i++)
{
if(n%p[i]==0)
{
//pf("%lld\n",p[i]);
c++;
while(n>1 && n%p[i]==0)
{
n/=p[i];
}
a=p[i];
}
if(n==1) break;
}
if(n==1)
{
if(c>1) printf("%lld\n",a);
else printf("-1\n");
}
else
{
if(c>0) printf("%lld\n",n);
else printf("-1\n");
}
}
}
/*input
1000
20
32
1
-1
-10
61536575712
8172385155
90090
12
199900
-26356
-32
8748234
23462482
23457826407
234872648001
436598
345387
2347
17
37
0
output:
5
5
-1
-1
-1
5
324889
16509869
13
3
1999
599
-1
113
690073
77418569
348559
521
16447
-1
-1
-1
*/
https://github.com/Shipu/OnlineJudgeProblemSolutionWithCPlusPlus/tree/master/uva/11466/11466.cpp