H pair 2019牛客多校第七場

2021-09-26 06:03:57 字數 1430 閱讀 4352

傳送門:

這題一直忘了補。。。今天沒比賽剛好補了

比賽的時候看見以為是撒高階數論計數題,然而怎麼過了這麼多人,最後沒想到是數字dp。

我們知道對於位運算來說,當高位& >c 或者 高位^ 所以從高位開始數字dp

dp[pos][dc][xc][sta][stb][az][bz]表示從最高位到pos+1位所有列舉的情況 的&值與c的大小為dc,^值與c的大小為xc, 當前數字是否等於a的高位的情況sta,b的stb,以及當前a是否為0的情況az,b的bz   :這些狀態下最後合法的方案數。

dc和xc 大於c就是2,等於c就是1,小於c就是0.

當前的x高位與a的高位相等sta=1,否則=0,stb一樣。

當前x還是0,az=1,否則=0,bz一樣。

邊界情況是否合法就是 dc=2 || xc=0 而且az=0,bz=0,因為x,y都要》=1

#includeusing namespace std;

int aa,bb,cc;

int a[32],b[32],c[32];

long long dp[32][3][3][2][2][2][2];

long long ans;

bool vis[32][3][3][2][2][2][2];

inline void prework()

memset(dp,0,sizeof(dp));

memset(vis,false,sizeof(vis));

}inline long long dfs(int pos,int dc,int xc,int sta,int stb,int az,int bz)

if(vis[pos][dc][xc][sta][stb][az][bz])

return dp[pos][dc][xc][sta][stb][az][bz];

vis[pos][dc][xc][sta][stb][az][bz]=true;

int upx=!(sta && a[pos]==0);

int upy=!(stb && b[pos]==0);

int tdc,txc;

for(int i=0;i<=upx;i++)

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

else txc=xc;

dp[pos][dc][xc][sta][stb][az][bz]+=

dfs(pos-1,tdc,txc,sta && i==a[pos],stb && j==b[pos],az && i==0,bz && j==0);

} return dp[pos][dc][xc][sta][stb][az][bz];

}inline void mainwork()

inline void print()

int main()

return 0;

}

2019牛客多校第七場H Pair 數字DP

題意 給你乙個3個數a,b,c問有多少對pair i,j 1 i a,1 j b,i and j c或 i xor j c。a,b,c範圍為1e9.思路 場上一看以為是推式子加什麼篩做,無果。之後才知道是數字dp 以下思路來自學長的 orz 首先,我們可以把問題轉化為求i and j c並且 i x...

2019牛客多校第七場

給定乙個01串,求最少的劃分次數,使得每部分的01串都是迴圈字典序最小。從最長的整個串貪心,暴力判斷是否是迴圈字典序最小,若是,直接輸出前面的串,然後後面的串再進行新一輪判斷。include using namespace std const int n 205 int t string s vec...

2019 牛客 多校7 H Pair(數字dp)

鏈結 題意 給出a b c,求 x y cx y c x y c或x y cx y c xy c的 x,y 對數 1 x a 1 y b 1 x a,1 y b 1 x a 1 y b 思路 一開始不知道怎麼做,以前只做過乙個數的數字dp,沒想到兩個數也可以做。正著想的話就會有三種情況,倒著想的話只...