題目描述:已知t
,lx,
rx,l
y,ry
t ,l
x,rx
,ly,
ry
,問在滿足lx
≤x≤r
x,ly
≤y≤r
y,xo
ry=t
l x≤
x≤rx
,ly≤
y≤ry
,xor
y=
t的情況下,w=
xand
y w=x
andy
有多少種取值。
解題思路:
數字 dp 會變得比較方便。
考慮乙個數 w,我們要判斷是否存在一組 (x,y) 使得 lx ≤ x ≤ r x ,ly ≤ y ≤ r y 且
x ∨ y = t,x ∧ y = w。
這個過程就是從高位到低位構造 (x,y) 的過程。
• 若 t 的當前位為 0,w 的當前位為 0,則 x 和 y 當前位都填 0。
• 若 t 的當前位為 0,w 的當前位為 1,則這是乙個不合法的狀況。
• 若 t 的當前位為 1,w 的當前位為 0,則當前位上可能 x 填 0,y 填 1,
也可能 x 填 1,y 填 0。
• 若 t 的當前位為 1,w 的當前位為 1,則 x 和 y 當前位都填 1。
x 和 y 各自已經填了的部分可能挨著rx與 ry或lx與ly的上界 (即 x 或 y 的已填部
分是 r x 或 r y或lx或ly 的字首),也可能不挨,這樣就有 3 × 3 = 9 種狀態。
之前提到的第三種情況,同一步有兩種填法,會造成分叉,所以,如果我們
要判斷乙個 w 是否可行,在從高位到低位確定 x,y 的過程中,就需要把這9
種狀態分別可不可能出現記下來,這是乙個 9 位的二進位制數。
如何用 dp 的方式算出可行的 w 的種數呢?dp 的狀態是當前已經考慮過
的位數和那個 9 位的二進位制數。時間複雜度 o(logt),常數為 512。
#include
#define ll long long
using
namespace
std;
const
int n=65;
ll t,l1,l2,r1,r2,f[n][1
<<9];
int cnt,g[3][3];
pair sta[9];
ll dfs(int i,int s)
return f[i][s]=res;
}int main()
吉利數字 數字dp
中國人喜歡數字6和8。特別地,一些人喜歡滿足含有特定個數6和8的數。現在請求出,在區間 l,r 之間的第k大的含有x個6和y個8的數。輸入的第一行包括4個數字,l,r,x,y。接下來的一行給出該組資料的詢問數q。接下來q行中,每行有乙個整數k。對於某個詢問,輸出一行,為對應的第k大的數。如果不存在這...
NOIP模擬 數字DP 准考證號
題目描述 clc noip2015 慘跪,他依稀記得他的准考證號是 37 其實是假的 現在clc又將要面臨一場比賽,他希望准考證號不出現 37 連續 同時他又十分討厭 4 所以也不希望 4 出現在准考證號中。現在他想知道在 a 和 b 之間有多少合法的准考證號 輸入格式 輸入包含兩個整數,a b。輸...
Nowcoder E 詭異數字(數字dp)
牛客小白月賽8真的打的自閉了,感覺一點都不小白 t t 肯定是我太菜了,沒錯就是這樣的 題目鏈結 題解說這是乙個非常簡單的數字dp,沒接觸過,感覺挺難的 大概這就是菜吧 先稍微了解了一下數字dp,附上寫的非常好的數字dp詳解 然後看懂了大佬的 敲了一下再附上了我的理解 includeusing na...