美しい数字のCodeForces - 55D

質問の意味:

少数満たしの数を含む[RI、リチウム]間隔を見つけ、非ゼロの数のこの数のすべてのビットは、この数で分割することができます

 

ソリューション:

各ビットの値は、この数で分割することができるので、この数は、すべての桁数の公倍数であるが、最小公倍数ではないかもしれないことを意味します。

最小公倍数は2520 1,2,3,4,5,6,7,8,9です

そして、私たちは私たちのメモリ動作を実現するために2520以上のフェッチの数を決定しなければならないことを確認することができます

2520最小公倍数1--9ですので、我々はそれに1--25202520内のすべての残りの部分を見つける必要があるので、1--9 2520のいずれかの残りの部分のようにいくつかの数字は、確かに最小公倍数です。最後に、48を見つけます

各マッピング値のこの場所の48

あなたのサイズや配列DPを減らすことができますこの方法

DP [X] [Y] [Z]を表す:Xビットの列挙を、モジュロ番号2520は結果Y、現在のすべての対応するマッピングzの最小公倍数のビット数であります

 

コード:

1は // まず、それが問題に番号割り切れることができ上の数で割り切れるする必要があります。
2  // この数は数字上の最小公倍数LCM(ないGCD)誰です。
3  // 第二に、問題の分割との契約は、デジタルDP剰余テンプレートに変換しました。それはメモリアレイの検索を開くことができるようにLCM 1〜9の最大は、その後、2520パーセント、2520です。
図4は、 // 最後に、最終的な結果のために%2520パーセント、次いでLCMにわたって蓄積各桁にすることはできません。
5  // この方法で、あなたはMLEを見つけるポストに20 * 2520 * 2520、CFの配列を開く必要があります。
6  // 結果(LCM = A * B / GCD (b)参照)、 すべてのLCMを言うことである1から2520の範囲でLCMの各々はい、それはのGCDで割り切れるを注意深く観察されます数の約数。
7  // 数は実際には2520年です。だから、DPの前に、2520年には、テーブル、個別のハッシュへのLCMを行います。これは実際には48 LCMのです。アレイ* 2520 20 * 50のオープンをすることができます。
8は // 結果はint64型であることに注意してください。
図9の#include <stdio.hの>
 10の#include < 文字列・H>
 11#include <アルゴリズム>
 12の#include <iostreamの>
 13の#include <地図>
 14  使用 名前空間STDを、
15  CONST  INT MAXN = 20 16  CONST  INT MOD = 2520 17 typedefの長い 長いLL。
18 LLのV [MAXN]、DP [MAXN] [MOD + 50 ] [ 50 ]。
19地図<-1,11,11-> W。
20  LLのLCM(-1,11,11- B)
 21  {
 22      LL ANS = 分(A、B)。
23      一方(ANS)
 24     {
 25          であれば(%ANS == 0 &&%ANS == B 0ブレーク26          ans-- ;
27      }
 28      リターン(* B)/ ANS。
29  }
 30の LLのDFS(LL POS、LL和、LL STA、ブール限界)
 31  {
 32      であれば(STA == 0戻り 0 ;
33      であれば(POS == - 1 34      {
 35          リターン和%のSTA == 0 36      }
37      であれば(!限界&& DP [POS] [和] [W [STA] = - 1戻りDP [POS] [和] [W [STA]。
38      LLアップ=限界V [POS]:9 39      LL TMP = 0 40      のための式(I = LL 0 ; iは<アップ=; ++ I)
 41      {
 42          であれば(私は> 0 43          {
 44              TMP + = DFS(POS- 1、(SUM * 10 + I)%のMOD、LCM(STAを、I)、限界&& I == V [POS])。
45  
46          }
 47           TMP + = DFS(POS- 1、(SUM * 10 + I)%MOD、STA、私は== &&制限をV [POS]);
 48      }
 49      IF(限界)DP [POS] [SUM] [W [STA]] =!TMP;
 50      / / だけ上側時間行き、それはより多くの時間が節約できるので9、配列保存された内部をDPになります
51である     戻りTMP;
 52である }
 53であり、 LLは(LL ANS)を解く
 54である {
 55      LL POS = 0 ;
 56は     、一方(ANS)
 57は、     {
 58          V [POS ++] =%ANS 10 ;
 59          ANS / = 10 ;
 60      }
 61は、     リターン DFS(POS-101)。
62  }
 63  のint main()の
 64  {
 65      のLL T、L、R、M = 0 66      のscanf(" %I64d "、&T)。
67      のために(iは= LL 1、I <= MOD; ++ I)
 68      {
 69          であれば(MOD%I == 0 70          {
 71              ++ M。
72              [I] = W M。
73          }
 74     }
 75      のmemset(DP、 - 1はsizeof (DP))。
76      一方(t-- 77      {
 78          のscanf(" %I64d%I64d "、&​​L&R)。
79          のprintf(" %I64d \ n "、1-(R)-solve(解決1 ))。
80      }
 81      w.clear()。
82      リターン 0 ;
83 }

 

 

おすすめ

転載: www.cnblogs.com/kongbursi-2292702937/p/11926640.html