永遠7-1(20分)
「永遠番号」は、以下の制約を満たし、K桁の正整数Aです。
- Aのすべての数字の合計はMです。
- A + 1のすべての数字の合計がNであり; そして
- Mの最大公約数とn 2よりも大きい素数です。
今、あなたは、これらの永遠の番号を見つけることになっています。
入力仕様
各入力ファイルには、1つのテストケースが含まれています。各テストケースのために、最初の行は、整数正含まN (≤ 5 ) N(≤5を)。次いで、N行は、それぞれの対与える従うK (3 < K < 10 ) K(3 <K <10)とM (1 < M < 90 ) の意味が与えられるのをM(1 <M <90)、問題の説明インチ
出力仕様
K及びMの各対について、最初の行で印刷Case X
、X
ケースインデックス(1から始まる)です。その後、次の行で印刷nおよびA。数字は、スペースで区切る必要があります。解決策が一意でない場合は、n個の昇順に出力します。A.の昇順にまだ一意でない場合は、出力解決策、出力がない場合No Solution
。
サンプル入力
2
6 45
7 80
サンプル出力
Case 1 10 189999 10 279999 10 369999 10 459999 10 549999 10 639999 10 729999 10 819999 10 909999 Case 2 No Solution
[書]
この質問は、公式サイトのPAT試験にされていなかったので、何のテスト・セットが存在しない試料のみを介して行われ、エラーが見つかった場合、私を修正して、コメントをありがとう。
溶液:
この質問は、暴力的なことができますが、それは、これにより、サイクルタイムの短縮、プロセスで判断しなければなりません。
DFSは、一般的には相手の暴力であるので、この質問は、DFSを使用するのは比較的簡単です
しかし、ポイントは、タイムリーな剪定にされていない、または暴力との区別
特定のコードのコメントが記載されています。
[突然^ K-2ビットがビットされた後の状態は常に法律は、9,0-1であり、このルールが確立された場合M- 9 *(K-2)のために組み合わせて、それははるかに簡単になりました^ ...]
1の#include <iostreamの> 2の#include <ベクトル> 3の#include < ストリング > 4の#include <アルゴリズム> 5 使って 名前空間STDを、 6 INT NUMS、K、M、N。 7ベクター<ペア< INT、INT >> RES。 8 int型の除数(int型、int型 B)を// 求最大公约数 9 { 10 であれば(%bの== 0 ) 11 リターンB。 12 リターン除数(B、%B); 13である } 14 BOOL isPrime(INT X)// 判定がより素数大きくない 15 { 16 IF(X <= 2)リターン falseに、 17 のために(INT I = 2、I *はI <= X; ++ I) 18で IF(%I X == 0)リターン falseに、 19 リターン trueに、 20である } 21れる INT GetSum(INT X) 22れる { 23は INT合計= 0 ; 24 一方、(X) 25 { 26 の合計+ = X%10 。 27 X / = 10 。 28 } 29 リターン和。 30 } 31 ブールチェック(INT A) 32 { 33 INT B = A + 1 。 34 N = 0 。 35 一方、(B) 36 { 37 N + = B%10 。 38 B / = 10 ; 39 } 40 IF (isPrime(除数は(M))、N-) 41が リターン trueに、 42は 他の 43は、 リターン falseに、 44である } 45が 空隙 DFS(文字列&STR、INTインデックス、INT用桁、INT SUM) 46です { 47 IFない(指数> SUM = K ||> m)のリターン ; // これ以上のkビットよりも、0から始まる 48 IF(+ SUM 9。 *(K -索引- 1。)<M)リターン ; // 最初のインデックス番号9 mより低い他のビットとの全て満たすには小さすぎる 49 +ためのSTR [インデックス] =数字「0 」 ; // このステップは、ああ、書き込みの前、和がされているので加え 50 IF(SUM mの&&インデックス== K == - 1)// 満足 51である { 52は INT A = ストイ(str.c_str()); 53は、 IF (チェック()) 54である (res.push_back make_pair(N、A)); 55 リターン; 56である } 57である ため(INT I = 0 ; I < 10 ; ++I) 58 DFS(STR、指数+ 1 +、iが、和I)。 59 } 60 のint main()の 61 { 62 CIN >> NUMS。 63 のために(INT iは= 1 ; I <= NUMS ++ I) 64 { 65 CIN >> K >> M。 66 res.clear()。 67 文字列 strの(K、' 0 ' )。 68 のために(INT J = 1、J <; 10 ; ++J) 69 DFS(STR、0、J、J)。// 第一位不能为0 70 ソート(res.begin()、res.end()、[](対< 整数、整数 > V1、対< INT、INT > V2){ // 排序 71 であれば(V1 1次回== v2.first) 72 リターン v1.second < v2.second; 73 リターン v1.first < v2.first; 74 })。 75 のprintf(" ケースは%d \ nは" 、i)は、 76 であれば(res.size()> 0) 77 のための(自動A:RES) 78 COUT << a.first << " " << a.second << ENDL。 79 他の 80 のprintf(" ノーソリューション\ N " ); 81 } 82 リターン 0 。 83 }