这道题要用到唯一分解定理,n=p1^e1*p2^e2*p3^e3...(p1,p2,p3..),最终答案应该为gcd(e1,e2,e3,...);
(1)先打一个素数表
(2)直接求出e1,e2,e3...
(3)判断n是否是负的,若为负数,则需要先将其转化成为正数(PS:如果n为负数,那么ans一定是奇数,所以最后还要进行一个转化);
AC代码:
#include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #include<cstring> #define MAXN 100100 using namespace std; typedef long long ll; ll n; int k=0; int gcd(int a,int b) //gcd { if(b==0) return a; else return gcd(b,a%b); } int prime[MAXN]; bool vis[MAXN]; void seive()//筛法打表 { for(int i=0;i<=MAXN;i++) { vis[i]=1; } vis[0]=vis[1]=0; for(int i=2;i<=MAXN;i++) { if(vis[i]) { prime[k++]=i; for(int j=2*i;j<=MAXN;j+=i) vis[j]=0; } } } int main() { int T; scanf("%d",&T); int kase=1; seive(); int sum; while(T--) { sum=0; int flag=0; cin>>n; if(n<0) flag=1,n=-n; for(int i=0;i<k&&prime[i]*prime[i]<=n;i++) { if(n%prime[i]==0)//确定p { int ans=0; while(n%prime[i]==0) { n/=prime[i]; ans++; //求e } if(ans==0) sum=ans; else sum=gcd(sum,ans); ///更新sum } } if(n!=1) //如果没除尽 sum=1; if(flag==1) { while(sum%2==0) sum/=2; //负数转化 } cout<<"Case "<<kase++<<":"<<" "<<sum<<endl; } return 0; }