四校聯考 准考證號

2022-05-31 04:12:10 字數 1437 閱讀 5631

小\(z\)在一次大考中失利,留下了嚴重的心理陰影。他記得當時他的准考證號是\(37\),所以他不希望准考證是存在連續的\(2\)位是\(37\),此外,由於\(4\)是乙個不吉利的數字,所以小\(z\)同樣不希望出現\(4\)。現在已知小z的准考證號在\([a,b]\)之間,請計算有多少個符合要求的准考證號碼。

一行,\(2\)個整數\(a,b\)。

一行,乙個整數,表示符合要求的准考證號的數量。

25 50
14
\(a,b\;\leq\;2\;\times\;10^9\).

\(a_i\)記錄上限每一位的值.

\(f[i][j][0/1]\)表示第\(i\)位填\(j\),前\(i\)位是否與上限相同的方案數.

\(f[i][j][0]=\begin0&j=4\\\sum_^f[i-1][k][0]+\sum_^f[i-1][k][1]&j=7\\\sum_^f[i-1][k][0]+\sum_^f[i-1][k][1]&j\not=4,j\not=7\\\end\)

\(f[i][a_i][1]=\begin0&a_i=4\\0&a_i=7,a_=3\\f[i-1][a_][1]&a_i=7,a_\not=3\\f[i-1][a_][1]&a_i\not=4,a_i\not=7\\\end\)

類似字首和思想求解.

#include#include#include#include#include#include#include#include#include#include#define n 15

using namespace std;

typedef long long ll;

int f[n][n][2],a[n],b[n],n;

inline int func(int k)

for(int i=1,j=n;i<=n;++i,--j)

a[i]=b[j];

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

for(int i=0;iif(i!=4) f[1][i][0]=1;

f[1][a[1]][1]=1;

for(int i=2;i<=n;++i)

if(jelse if(j==a[i]&&a[i-1]!=4)

f[i][j][1]+=f[i-1][a[i-1]][1];

}else if(j==7)

if(jelse if(j==a[i]&&a[i-1]!=4&&(a[i-1]!=3||a[i]!=7))

f[i][j][1]+=f[i-1][a[i-1]][1];}}

}for(int i=0;i<=9;++i)

ret+=f[n][i][0]+f[n][i][1];

return ret;

}inline void aireen()

int main()

NOIP模擬賽 准考證號

准考證號 128m 0.1s ticket.cpp 蒟蒻hzwer noip2014慘跪,他依稀記得他的准考證號是37,現在hzwer又將要面臨一場比賽,他希望准考證號不出現37 連續 同時他又十分討厭4,所以也不希望4出現在准考證號中。現在他想知道在a和b之間有多少合法的准考證號 包含兩個整數,a...

NOIP模擬 數字DP 准考證號

題目描述 clc noip2015 慘跪,他依稀記得他的准考證號是 37 其實是假的 現在clc又將要面臨一場比賽,他希望准考證號不出現 37 連續 同時他又十分討厭 4 所以也不希望 4 出現在准考證號中。現在他想知道在 a 和 b 之間有多少合法的准考證號 輸入格式 輸入包含兩個整數,a b。輸...

四校聯考 20171001

二分 期望得分 70 實際得分 10 列舉最高的高度可能為多少 二分。o logm 列舉最高高度應該位於哪一列上.o n 左右擴散列舉出需要用的積木總數,與m相比較。容易發現合法的高度的最高值,最終需要搭建乙個金字塔。1,3,5,7 正解是預處理出每一列作為最高列的左右邊界。然後再二分最大高度。ch...