J - Mysterious Bacteria
阿新 • • 發佈:2018-11-15
題目連結:https://cn.vjudge.net/contest/70017#problem/J
題目大意:給你一個數a,你要求出最大的一個數x,滿足b的x次方等於a;
題解:根據算數基本定理,一個數可以分為a=p1^x1*p2^x2.......*pn^xn;所以算出x1,x2,.....,xn的最大公因子就行了,但是如果a為負數的情況下求出的x一定要為奇數,如果求出的是偶數,那麼就要一直把x除以2,知道x為奇數。
程式碼:
#include <iostream> #include <algorithm> #include <stdio.h> #include <stdlib.h> #include <string.h> using namespace std; const int maxn=1e6+5; int prime[maxn+1],tag[maxn+1],cnt; void Prime() { memset(tag,0,sizeof(tag)); cnt=0; tag[0]=tag[1]=1; for(int i = 2; i<maxn; i++) { if(!tag[i]) prime[cnt++]=i; for(int j=0; j<cnt && prime[j]*i<maxn; j++) { tag[i*prime[j]] = 1; if(i % prime[j]==0) break; } } } int ss[maxn]; int main() { Prime(); int T; int m=0; scanf("%d",&T); while(T--) { long long int a,b; ++m; scanf("%lld",&a); b=a; a=abs(a); int ans=0; for(int i=0;i<cnt&&prime[i]*prime[i]<=a;i++) { if(a%prime[i]==0) { int ii=0; while(a%prime[i]==0) { a=a/prime[i]; ii++; } if(ii!=0) ss[++ans]=ii; } } if(a>1) { printf("Case %d: 1\n",m); } else { int num=ss[1]; for(int i=2;i<=ans;i++) { num=__gcd(num,ss[i]%num); } if(b<0) { while(num%2!=1) { num=num/2; } } printf("Case %d: %d\n",m,num); } } return 0; }