您的位置:首页 > Web前端

zoj 2124 || poj 1730 Perfect Pth Powers

2011-02-01 12:22 459 查看
数论,求使得 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: