PATグレード[2019年9月] --A1160フォーエバー試験[20]

永遠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 XXケースインデックス(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ベクター<ペア< INTINT >> 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、対< INTINT > 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()> 077              のための(自動A:RES)
 78                  COUT << a.first << "  " << a.second << ENDL。
79          他の
80              のprintf(" ノーソリューション\ N " );
81      }
 82      リターン 0 83 }

 

 

おすすめ

転載: www.cnblogs.com/zzw1024/p/11964145.html