#include<iostream>
#include<cstdio>
using namespace std;
//const int MOD=1000000007;
int vis[40100]; //标记是否是素数
int q[12000]; //质数
int main()
{memset(vis,1,sizeof(vis));
vis[1]=0;
int t=0;
for(int i=2;i<=40000;i++)
{if(vis[i])
{for(int j=i;j<=40000;j+=i)
vis[j]=0;
q[++t]=i;
}
} //打素数表
long long int shu[100],ge[100];
long long int n;
while(cin>>n)
{if(n==1){cout<<"0"<<endl; continue;} //处理特例
if(n==4){cout<<3<<endl; continue;}
long long int m=1,k=0;
long long int tt=n;
memset(shu,0,sizeof(shu));
memset(ge,0,sizeof(ge));
while(tt>1&&m<t) //质数分解,t是素数表的大小
{if(tt%q[m]==0)
shu[++k]=q[m]; //存储不同的质因子
if(k>=3)break;
while(tt%q[m]==0)
{tt/=q[m];
ge[k]++; //记录各质因子的幂次
}
m++;
}
if(tt>1) //若都不能分解,说明是素数 !!!!!!!!!
{shu[++k]=tt;
ge[k]++;
}
if(k>=3) {cout<<1<<endl; continue;} //能分解成三个及以上素因子的输出1
if(k==1)
{if(shu[1]!=2) //分解为某非2质数的几次方时输出n-1
cout<<(n-1)<<endl;
else cout<<1<<endl; //否则为2的大于1次方,输出1
}
if(k==2) //分解为2个素数
{if(shu[1]==2 && ge[1]==1) //为2*某个素数的几次方(大于等于1次)时输出n-1
cout<<n-1<<endl;
else cout<<1<<endl; //否则输出1
}
}
}
tjut 3508
最新推荐文章于 2019-01-27 21:10:00 发布