思路:暴力枚举幂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; }