Nguồn đề bài: http://vn.spoj.com/problems/C11PRIME/
1. Đề bài C11PRIME spoj
Số nguyên tố là số chỉ chia hết cho 1 và chính nó. Trong một buổi dã ngoại của trường, bất ngờ TMB bị thầy giáo đố một câu như sau: “Một số có dạng p^q là lũy thừa cao của một số nguyên tố khi và chỉ khi p là một số nguyên tố và q > 1. Thầy sẽ cho em một số N bất kỳ và em hãy cho biết đó có phải là lũy thừa cao của một số nguyên tố hay không?”. Không phải lúc nào cũng mang theo máy tính bên mình, đây là lúc TMB cần bạn.
Yêu cầu: Cho số N, hãy giúp TMB trả lời câu đố của thầy giáo, nếu N là lũy thừa cao của một số nguyên tố thì in ra 2 số p và q tương ứng, nếu không thì ghi 0.
Giới hạn:
n <= 10^18
Input:
1 dòng duy nhất chứa n
Output:
1 dòng duy nhất là kết quả
Ví dụ:
Input | Output |
27 | 3 3 |
Input | Output |
10 | 0 |
2. code tham khảo C11PRIME
const fi=''; vc=high(int64); du=1000000000000000000; type data=longint; data1=int64; var N:data1; f:text; function KTSNT(n:data1):boolean; var i:data; begin for i:=2 to trunc(sqrt(n)) do if n mod i=0 then exit(false); exit(true); end; function tinhcan(a:int64; b:data1):int64; begin tinhcan:=round(exp(ln(a)/b)); end; function amuk(a:int64; k:data):int64; var i:data; res:int64; begin res:=1; for i:=1 to k do begin res:=(res*a) mod du; end; exit(res); end; procedure xuli; var i,j:data; so:data1; begin for i:=2 to 60 do begin so:=tinhcan(n,i); if (amuk(so,i)=n) and ktsnt(so) then begin writeln(so,' ',i); exit; end; end; writeln(0); end; begin assign(f,fi); reset(f); readln(f,n); close(f); xuli; end.