オリジナルタイトル
トピック分析
まず、pは素数で検出する必要があります質問の意味によると、これは、そうでなければ、それは合成数だった、できない、そしてそれが素数であるその後、pはこれらの数字割り切れることができるかどうかについて決定し、エジプトのスクリーンアウト1-SQRT(1E9)素数をふるいすることができます。Asをp番目の電源は、直接ライン上で高速電力を設定します。
コード
1の#include <cstdioを> 2の#include <cstdlib> 3の#include <iostreamの> 4の#include <アルゴリズム> 5の#include <ユーティリティ> 6の#include <ctimeの> 7の#include <cmath> 8の#include <CStringの> 9# <含む文字列 > 10の#include <積層> 11の#include <キュー> 12の#include <ベクトル> 13の#include < 設定 > 14の#include <地図> 15 16 使って 名前空間STDを、 17のtypedef 長いです ロングLL; 18 CONST INT INF_INT = 0x3f3f3f3f 。 19 CONST LL INF_LL = 0x3f3f3f3f3f3f3f3f 。 20 21 のconst INT MAX = 40000 。 22 ブールis_prime [MAX]。 23 INT プライム[MAX]; 24 int型のCNT; 25 26 ボイドプレ() 27 { 28 のために(int型 I = 2 ; iは、MAXを<; iは++)is_prime [I] = 真。 29 のための(int型I = 2 ; iは、MAXを<; iは++ ) 30 { 31 であれば(is_prime [I]) 32 { 33 プライム[CNT ++] = I。 34 のために(INT J =(I << 1); J <MAX; J + = I)is_prime [j]は= 偽。 35 } 36 } 37 } 38 39 LLのq_power(LL、LLのB、LLのMOD) 40 { 41 LLのRES = 1 。 42 %= MOD。 43 一方、(B) 44 { 45 もし(B&1)RES =(RES * A)%のMOD。 46 A =(* A)%MOD。 47 B >> = 1 。 48 } 49 リターンのres; 50 } 51 52 ブールチェック(LL X) 53 { 54 であれば(X <MAX)戻りis_prime [X]。 55 については、(int型私= 0 ;私はCNT <I ++は) 56が あれば(!(X%がプライム[i]は))を返す 偽。 57 リターン 真。 58 } 59 60 のint main()の 61 { 62 // freopenは( "black.in"、 "R"、STDIN)。 63 // freopenは( "black.out"、 "W"、STDOUT)。 64 プレ()。 65 LLのA、P。 66 しばらく(〜のscanf(" %のLLDの%のLLD "、&P&A)&&(|| P)) 67 { 68 であれば(q_power(P、P)== &&!チェック(P))のprintf(" はい\ nを" ); 69 他の printf関数(" なし\ nを" ); リターン 0 ; 72 }