[LuoguP4124] [CQOI2016]電話番号

タイトル説明

人々は、縁起の良い番号を、覚えやすい電話番号を選択したいときに。このような数字は、いくつかの隣接し、高調波の自由不運数などの同じ番号が含まれています。また、これらの要因を検討する新しい番号を発行する際に携帯電話事業者は、我々は数字は別売りメディアセグメントからのいくつかの機能が含まれて選択します。事前計画を容易にするために、事業者は、自動的にセグメント番号の特性を満たすために数字の数をカウントするためのツールを開発したいと考えています。

請求項2を検出するために必要なツールの数:数が少なくともに表示される  3つの隣接する同一の番号は、できない数字の両方  8及び  4。条件を満たさなければならない2つの数値を含むことを特徴。13000988721,23333333333,14444101000次のような数字の条件を満たしています。1015400080,10010012022:例数の条件を満たしていません。

電話番号である必要があります  1個の前にプリアンブルずに、数字  0。二つの数字受信ツール  L  と  R、自動統計  [L、R]  区間内の全ての条件数を満たす数です。L  及び  Rはである  。1 携帯電話番号。

入力形式

入力ファイルの内容ライン、スペースで区切らのみ  2個 の正の整数  Lは、R

出力フォーマット

出力ファイルの内容のための唯一のライン  1つ の条件を満足する電話番号の数を表す整数。

サンプル入力と出力

入力#1
12121284000 12121285550
出力#1
5

説明/ヒント

サンプルは、次のように説明番号満たす条件:12121285000、12121285111、12121285222、12121285333、12121285550を。

データ範囲:

  10 ^ 10 <= L、R <= 10 ^ 11

アイデア:

    これはデジタルDPです

コード:

書式#include <cstdioを> 
する#include <cstdlib> 
書式#include <iostreamの> 
の#include <アルゴリズム> 
の#include "のCString" 
名前空間stdを使用。
#defineは長いlong int型
INT L、R、LEN、NUM [15]、DP [13] [13] [13] [2] [2] [2] [2]。
読み取りINT()
{ 
	int型のx = 0、F = 1。
	チャーCH = GETCHAR()。
	一方、(CH < '0' || CH> '9'){IF(CH == ' - ')は、f = -1; CH = GETCHAR();} 
	一方(CH> = '0' && CH <= '9 '){X = X * 10 + CH-'0'; CH = GETCHAR();} 
	戻りのx * Fを、
} 

INT F(INT P、INT A、INT B、ブールC、ブールD、BOOL pan4、BOOL pan8)
{ 
	IF(pan4 && pan8)戻り0; 
	IF(p <= 0)戻りC。
	int型のres = 0;
	int型LIM =!
	(; I <= LIM I ++は、I = 0をINT)用
	{ 
		RES + = F(P-1、I、C ||(I == B && I == A)、D ||(I <LIM)、pan4 ||(I == 4)、pan8 ||(I == 8))。
	} 
	戻りDP [P] [A] [B] [C] [D] [pan4] [pan8] =のRES。
} 
INT CALC(INT X)
{ 
	IF(X <1E10)戻り0; 
	memsetの(DP、-1、はsizeof(DP))。
	用(LEN = 0; X、X / = 10)NUM [++ LEN = X%10。
	int型のres = 0; 
	以下のために(INT I = 1; I <= NUM [LEN]; iは++)
	{ 
		RES + = F(10、I 0,0、I <NUM [LEN]、I == 4、I == 8)。
	} 
	RESを返します。
} 
()主符号付き
{ 
	L =読み取ります()。
	R =リード()。
	printf( "%のLLD"、CALC(R) - CALC(L-1))。
	0を返します。
}

  

 

おすすめ

転載: www.cnblogs.com/yelir/p/11535978.html