4521 Cqoi2016 手機號碼

2021-07-23 06:46:42 字數 1834 閱讀 3072

time limit: 10 sec  

memory limit: 512 mb

submit: 438  

solved: 269 [

submit][

status][

discuss]

人們選擇手機號碼時都希望號碼好記、吉利。比如號碼中含有幾位相鄰的相同數字、不含諧音不

吉利的數字等。手機運營商在發行新號碼時也會考慮這些因素,從號段中選取含有某些特徵的號

碼單獨**。為了便於前期規劃,運營商希望開發乙個工具來自動統計號段中滿足特徵的號碼數 量。

工具需要檢測的號碼特徵有兩個:號碼中要出現至少3個相鄰的相同數字,號碼中不能同

時出現8和4。號碼必須同時包含兩個特徵才滿足條件。滿足條件的號碼例如:13000988721、

23333333333、14444101000。而不滿足條件的號碼例如:1015400080、10010012022。

手機號碼一定是11位數,前不含前導的0。工具接收兩個數l和r,自動統計出[l,r]區間

內所有滿足條件的號碼數量。l和r也是11位的手機號碼。

輸入檔案內容只有一行,為空格分隔的2個正整數l,r。

10^10 < =  l < =  r < 10^11

輸出檔案內容只有一行,為1個整數,表示滿足條件的手機號數量。

12121284000 12121285550

5樣例解釋

滿足條件的號碼: 12121285000、 12121285111、 12121285222、 12121285333、 12121285550 [

submit][

status][

discuss]

顯然是數字dp,但是可以從中學到--狀態設計的優劣直接關係到編碼難度。。。。。。。gg

fi,j,k,a,b:第i位是j,最長段連續k位,是否貼著最大值,4和8的狀態,,,方案數

如果k大於3,直接取3即可

這樣轉移起來就非常方便了。。。。

#include#include#include#includeusing namespace std;

typedef long long ll;

const int s[10] = ;

const ll wa = 10000000000ll;

int a[15];

ll l,r,f[15][10][4][2][4];

ll solve(ll now)

memset(f,0,sizeof(f));

for (int i = 1; i <= a[1]; i++)

f[1][i][1][i==a[1]][s[i]] = 1;

for (int i = 1; i <= 10; i++)

for (int j = 0; j < 10; j++)

for (int k = 1; k <= 3; k++)

for (int b = 0; b < 3; b++)

if (f[i][j][k][1][b])

for (int t = 0; t <= a[i+1]; t++)

}ll ret = 0;

for (int j = 0; j < 10; j++)

for (int a = 0; a < 2; a++)

for (int b = 0; b < 3; b++)

ret += f[11][j][3][a][b];

return ret;

}int main()

BZOJ 4521 Cqoi2016 手機號碼

人們選擇手機號碼時都希望號碼好記 吉利。比如號碼中含有幾位相鄰的相同數字 不含諧音不 吉利的數字等。手機運營商在發行新號碼時也會考慮這些因素,從號段中選取含有某些特徵的號 碼單獨 為了便於前期規劃,運營商希望開發乙個工具來自動統計號段中滿足特徵的號碼數 量。工具需要檢測的號碼特徵有兩個 號碼中要出現...

bzoj4521 CQOI2016 手機號碼

人們選擇手機號碼時都希望號碼好記 吉利。比如號碼中含有幾位相鄰的相同數字 不含諧音不吉利的數字等。手機運營商在發行新號碼時也會考慮這些因素,從號段中選取含有某些特徵的號碼單獨 為了便於前期規劃,運營商希望開發乙個工具來自動統計號段中滿足特徵的號碼數量。工具需要檢測的號碼特徵有兩個 號碼中要出現至少3...

bzoj 4521 Cqoi2016 手機號碼

感覺get到了一種數字dp的新姿勢,加一位表示當前要填的數有沒有限制 感覺以前的寫法都太蠢了 這麼寫有兩個地方要注意 1.每dp到一位時需要f i 初始狀態 相當於這位前都是前導零 這道題我把前兩位填了兩個10作為初始狀態 2.因為有了1,所以初始狀態後的第一位不能填0,需要特判 f i j k l...