質問:風の強い数
制限時間:1秒 メモリ制限:512メガバイト
フェイス質問
タイトル説明
これはウィンディウィンディの数を定義:先行ゼロがなく、二つの数間の少なくとも違いに隣接
正の整数の数がウィンディと呼ばれています。
ウィンディはAで、知りたいとB 、Aを含む、間及びB、どのように多くのウィンディ数の合計?
入力形式
2つのライン数、それぞれ、A、B 。
出力フォーマット
出力答えを表す整数。
サンプル入力
1 10
サンプル出力
9
問題の解決策
私のデジタルDPエントリーのタイトル、ああ、実際には、非常に簡単。
[I] [j]はiのビットを埋める意味セットF、最大数は、風、jのビット数です。
だから、神が直接、少なくとも2つの問題の一時的な位置ずれを考慮して、激しくすべての値を計算し、DP問題のパイロット0をかれらかを検討していません。
そして、それは再び精力的に1-9サイクルからjはそれに答える蓄積し、DPありません。
書式#include <iostreamの> の#include <cstdioを> する#include <CStringの> の#include <cmath> に#define int型、長い長い #defineし RINTが登録int型 の#define LL長い長い 使って 名前空間はstd; INT [F 20 ] [ 15 ] = { 0 }、B。 LL PW [ 15 ]。 ボイドprework() { PWは[ 0 ] = 1 。 ため(RINT i = 1 ; iが= < 12 ; ++ I)PW [I] = PW [I- 1 ] * 10 。 用(RINT I = 0 ; I <= 9 ; I ++は)のF [ 1 ] [I] = 1 ; のための(I = RINT 2 ; I <= 11 ; Iは++)// 列挙ビット 用(RINT = J 0、J <= 9。 ; J ++)// 列挙最高 のための(RINT K = 0 ; K <= 9は、K ++)// 状態列挙の最上位ビットを、ビューこの状態高い IF(ABS(JK)> = 2)F [I] [J] + = F [I- 1 ] [K]; } int型の COUNT(INT X) { int値 W = 0、Y、ANS =0 、事前; 一方、(PW [W] <= X)++ W。// 求位数 ため(RINT i = 1 ; iはW <; ++ I)// 枚举位数 ため(RINTのJ = 1 ; J <= 9 ; ++ j)は// 枚举最高位 ANS + = F [i]は[J]。 Y = X / PW [W- 1 ]。 ため(RINT i = 1 ; iがyと<; ++ I)ANS + = F [W] [I]。 予備 = Y。 X%= PW [W- 1 ]。 用(RINT I = W- 1 ; I> = 1 - ; I) { Y= X / PW [I- 1 ]。 用(RINTのJ = 0 ; J <Y; ++ j)の 場合(ABS(J-PRE)> = 2 ) ANS + = F [I] [J]。 もし(ABS(プレY)< 2)ブレーク。 予備 = Y。 X%= PW [I- 1 ]。 } 戻りANS。 } ()主符号付き { scanf関数(" %のLLDの%のLLD "、&A、&B); prework(); coutの <<回数(B + 1)-count(A)<< ENDL。 リターン 0 ; }