牛客網模擬(第一場)超級素數
阿新 • • 發佈:2019-02-16
思路:暴力列舉冪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; }