問題描述
如果乙個數字能表示為pq(表示冪運算)且p為乙個素數,q為大於1的正整數就稱這個數叫做超級素數冪。現在給出乙個正整數n,如果n是乙個超級素數冪需要找出對應的p,q。
輸入描述
輸入乙個正整數n(2 ≤ n ≤ 10^18)
輸出描述
如果n是乙個超級素數冪則輸出p,q,以空格分隔,行末無空格。
如果n不是超級素數冪,則輸出no
輸入例子
輸出例子
3 3分析
n = p^q,n=[2, 10^18],顯然p的範圍很大,沒法列舉;q作為指數項,最大值為logn,是可以列舉。所以我們可以窮舉q,反求p,判斷p是不是整數和素數,如果是整數則表示找到一組解了。
note
按照題目的說法,超級素數冪的p q對是唯一的;
如何找到合適的可列舉空間是解決問題的關鍵。
**#include
#include
#include
using namespace std;
bool isprime(long long l)
for (long long i = 2; i <= sqrt(l); i++)
if (l % i == 0) return false;
return true;
int main()
long long n;
scanf("%lld", &n);
long long m = log(n) / log(2);
for (int i = 2; i <= m; i++)
double d = pow(n, 1.0 / i);
long long l = (long long)d;
if (abs(d - l) > 0.0001)
continue;
if (isprime(l))
printf("%lld %d\n", l, i);
return 0;
printf("no\n");
return 0;
超級素數冪
輸入描述 輸入乙個正整數n 2 n 10 18 輸出描述 如果n是乙個超級素數冪則輸出p,q,以空格分隔,行末無空格。如果n不是超級素數冪,則輸出no 輸入例子 27 輸出例子 3 3 解析 直接用整數n去從小到大餘素數會超時。正確做法是對n開方,依次開1 2 1 3直到結果小於2 最小的素數 超級...
超級素數冪
如果乙個數字能表示為p q 表示冪運算 且p為乙個素數,q為大於1的正整數就稱這個數叫做超級素數冪。現在給出乙個正整數n,如果n是乙個超級素數冪需要找出對應的p,q。include include using namespace std 素數判定函式 bool isprime int n for i...
超級素數實現演算法
1.超級素數的概念 乙個m位數的素數,從高位到低位一次去掉乙個數,仍然都是素數。輸入m,輸出m為超級素數的總個數並且輸出最大m為的超級素數 2.分析 可以從兩個方向出發 1 從1位開始找素數,然後一步步加位數,查詢素數 2 從m位開始找,然後在去掉最高位,在查詢素數。不管是什麼方法,我們都發現,超級...