サンプル入力
11 10
サンプル出力
10 5 7 5 8 3 9 5 7 4 10
(喜喜喜が、唯一のに役立ついくつかdalaoのノウハウを得るために、あなたがメモリ内になければなりません)
この質問はああ包含と除外の使用であり、
#include <ビット/ STDC ++ H> に#define LL長い長い 使用して 名前空間STDを、 const int型 N = 100005 ; 整数nは、素数[N]、TOT、CNT。 BOOL VIS [N]。 LL M、NUM [N]、ANS。 ボイドgetprime(){ 用(INT iは= 2、I <= N; I ++ ){ 場合(!VIS [I]) プライム[ ++ TOT = I。 以下のために(INT J = 1 ; J <= TOT && iが素数[j]を* <= nであり、j ++ ){ VIS [I*プライム[J] = 真; もし(I%プライム[J] == 0 ) ブレーク。 } } } ボイドワーク(INT N){ ため(INT iは= 1 ; I <= TOT &&プライム[I] <= N; I ++ ){ int型 X = プライム[I]; もし(N%X == 0 ){ NUM [ ++ CNT] = X。// 一方(N%X == 0 ) N / = X。 } } } // その互いに素ではないが失われ、残りは友人の数に素数である // 均等に確認してください、彼はそれに総理の素因数ではないことを、自分の彼の素因数を探して、カットにそれをかじることが素数でない のボイド DFS(INT A、INT P、INT S){ // 数pは、約、S、正または負の(プラスまたはマイナス)であり、 IF(!A){ ANS + =(LL)* S M / P; // M / pはp型の数mの倍数である リターン; } // 素因数の数を見る- >に加え、2 - >保存、3 - >プラス... DFS( - 1 、P、S) ; DFS(A - 1、* P NUM [A]、 - 1。 * S); / * 例えば、そこ因子3,4,5- / \ 1 / \ 1. 3 / \ / \ 。3. 1. 4. 3. 4 * / \ / \ / \ / \ 。3 * *。4. 5. 4. 3. 3 * * *。5. 4. 5. 4. 3. 1. 5 * / } (メイン符号付き){ CIN >> N- >> M; getprime(); // 素数テーブル のための(INT I = 1 ; I <= N I ++ ){ ANS = 0 ; CNT = 0 ; // 品質因子数 ワーク(I); // iを見つけます素因数の数 DFS(CNT、1);、1つ printf(" %のLLD \ n " 、ANS)。 } }