1. 程式人生 > >牛客網模擬(第一場)超級素數

牛客網模擬(第一場)超級素數

思路:暴力列舉冪q,然後n開q次冪之後檢查一下是否相等和p是否是素數。

/*****************************牛客統測**********************************
 *                             超級素數
 *							XSH/2017/3/12
 *題目描述
 *如果一個數字能表示為p^q(^表示冪運算)且p為一個素數,q為大於1的正整數就
 *稱這個數叫做超級素數冪。現在給出一個正整數n,如果n是一個超級素數冪需要
 *找出對應的p,q。 
 *
 *輸入描述 :
 *輸入一個正整數n(2 ≤ n ≤ 10 ^ 18)
 *
 *輸出描述 :
 *如果n是一個超級素數冪則輸出p, q, 以空格分隔, 行末無空格。
 *如果n不是超級素數冪,則輸出No
 *
 *輸入例子:
 *27
 *
 *輸出例子 :
 *3 3
************************************************************************/
bool isPrime(long long n)
{
	long long tmp = sqrt(n);
	for (long long i = 2; i <= tmp; ++i)
	if (0 == n%i) return false;
	return true;
}

long long isPower(long long m, int n)
{
	return (0 == n) ? 1 : isPower(m, n - 1)*m;
}

void isSuper(long long n)
{
	//方法一:
	bool flag = true;
	for (long long i = 2;; ++i)
	{
		double tmp = pow(n, 1.0 / i);
		if (tmp < 2.0) break;
		if (isPrime((long long)(tmp + 0.1)) && n == isPower(tmp + 0.1, i))
		{
			flag = false;
			cout << (int)(tmp + 0.1) << " " << i << endl;
		}
	}
	if (flag) cout << "No" << endl;

	//方法二:
	//時間複雜度O(log2(N) * sqrt(sqrt(N))),也就是 以2為底N的對數 乘以 N的4分之1次方
	//N = p的q次方,顯然p最小時q最大,因為最小的素數是2,所以q的上限也就是log2N即log10(n) / log10(2)
	/*int p, q;
	int up = log10(n) / log10(2);
	for (q = 2; q <= up; q++)
	{
		p = pow(n, 1.0 / q);
		//判斷p的q次方是否為n且p為素數      
		if (pow(p, q) == n && isPrime(p))
		{
			cout << p << " " << q << endl;;
			break;
		}
	}
	if (q > up)
		cout << "No" << endl;*/
}

int main()
{
	long long N;

	while (cin >> N)
		isSuper(N);

	system("pause");
	return 0;
}