zoj 2124 || poj 1730 Perfect Pth Powers

 

数论,求使得 x = b^p的最大的p。

 

这题之前用pow神马的,一直过不了。昨天看到了,有个想法,想试试。

 

先求质因数,质因数每个的个数肯定和p有关。

 

求出之后,想了想,呀,这不就是求这些质因数重复个数的最大公约数嘛!!!激动~!

 

写了 = =。。WA。但是数据都能过。还用了long long也过不了。搜了下,说这题有负的数据,FT!!!

 

改了改。如果是负数的话,质因数重复个数如果是偶数一直除2一直到奇数,因为如果不这么弄的话,求出来的最大公约可能就是2的倍数了,而这个对于负数来说是不可能的。然后再求最大公约数即可。用int就好。

 

#include <cstdio> #include <cstdlib> #include <iostream> #include <string.h> #include <math.h> #include <limits.h> #define MAX 50000 using namespace std; int f[MAX]; int num[MAX]; int pri[MAX]; int cou; void init() { int i,j; cou = 0; memset(num,0,sizeof(num)); for(i=2; i<MAX; i++) for(j=2; j*i<MAX; j++) if( num[i] == 0 ) num[j*i] = 1; for(i=2; i<MAX; i++) if( num[i] == 0 ) pri[cou++] = i; } int gcd(int n,int m) { return m == 0 ? n : gcd(m,n%m); } int Analy(int n) { int fac = 0; int i = 0 ,num; int x = n; while( n != 1 ) { num = 0; if( abs(pri[i]) > sqrt(fabs((double)n)) ) break; if( n % pri[i] == 0 ) { while( n % pri[i] == 0 ) { num++; n /= pri[i]; } f[fac] = num; fac++; } i++; } if( fac == 0 ) return 1; if( x < 0 ) for(i=0; i<fac; i++) while( f[i] % 2 == 0 ) f[i] /= 2; if( fac == 1 ) return f[0]; int tmp = gcd(f[0],f[1]); for(i=2; i<fac; i++) tmp = gcd(f[i],tmp); return tmp; } int main() { init(); int n; int ans; while( scanf("%d",&n) != EOF && n ) { memset(f,0,sizeof(f)); ans = Analy(n); printf("%d/n",ans); } return 0; }  

 

 

你可能感兴趣的:(zoj 2124 || poj 1730 Perfect Pth Powers)