uva 10622 Perfect P-th Powers // poj 1730 Perfect P-th Powers
/* 题目: 给出n,问n = b^p中p符合该等式的最大值 分析: 先求出所有n的质因子,然后对这m个质因子分类统计,比如 n = 36时,可以分成 2个2,2个3,然后求出所有这些基数的 最大公因数gcd。另外由于有负数的存在,所以求到的gcd若 为偶数时,需要不断除二直到为奇数为止 */ #include <iostream> #include <cstdio> #include <cstring> #include <cmath> using namespace std; const int X = 150000; int di[50],top; int prime[15000],cnt; bool notprime[X]; int num[X]; int ans[50]; void init() //筛法 { cnt = 0; memset(notprime,false,sizeof(notprime)); for(int i=2;i<X;i++) if(!notprime[i]) { prime[++cnt] = i; for(int j=i+i;j<X;j+=i) notprime[j] = true; } } int gcd(int a,int b) { if(a==0) return b; return gcd(b%a,a); } int main() { freopen("sum.in","r",stdin); freopen("sum.out","w",stdout); long long n; int half; init(); while(cin>>n,n) { memset(num,0,sizeof(num)); long long temp = max(n,-n); half = (int)sqrt(temp*1.0); top = 0; for(int i=1;prime[i]<=half+1;i++) //求出所有质因数 if(temp%(long long)prime[i]==0) { temp /= prime[i]; di[++top] = prime[i]; i--; num[di[top]]++; if(!temp||temp==1) break; } if(top==0) { printf("1\n"); continue; } memset(ans,0,sizeof(ans)); int head = 0; for(int i=1;i<=top;i++) ans[++head] = num[di[i]],num[di[i]] = 0; int res = ans[1]; for(int i=2;i<=head;i++) { res = gcd(res,ans[i]); if(res==1) break; } if(n<0) { if(res%2==0) { while(res%2==0) res >>= 1; printf("%d\n",res); } else cout<<res<<endl; } else printf("%d\n",res); } return 0; }