傳送門:
這題一直忘了補。。。今天沒比賽剛好補了
比賽的時候看見以為是撒高階數論計數題,然而怎麼過了這麼多人,最後沒想到是數字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,沒想到兩個數也可以做。正著想的話就會有三種情況,倒著想的話只...