數字dp。
這次是針對&和^的,所以數字變成了二進位制位數。針對二進位制從高到低位進行搜尋即可。
#include#include#include#include#include#include#include#include#include#include#include//#include#include#define up(i,a,b) for(int i=a;ib;i--)
#define upd(i,a,b) for(int i=a;i<=b;i++)
#define dwd(i,a,b) for(int i=a;i>=b;i--)
//#define local
typedef long long ll;
const double esp = 1e-6;
const double pi = acos(-1.0);
const int inf = 0x3f3f3f3f;
const int inf = 1e9;
using namespace std;
int read()
while (ch >= '0' && ch <= '9')
return x * f;
}typedef pairpir;
ll dp[40][3][3][2][2][2][2];
int cnta[40], cntb[40], cntc[40];
int a, b, c, t;
/*za,zb是針對數字0000這樣的數字,題目要求大於等1,所以要去除零的影響
ad是and,xr是xor,limit表示是否達到上限*/
ll dfs(int len, int ad, int xr, int limita, int limitb, int za, int zb)
ll &ans = dp[len][ad + 1][xr + 1][limita][limitb][za][zb];//記憶化
if (ans != -1)return ans;
int a = limita ? cnta[len] : 1;//上限
int b = limitb ? cntb[len] : 1;
ll res = 0;
upd(i, 0, a)
}ans = res;
return res;
}int main()
cout << dfs(31, 0, 0, 1, 1,0,0)<}
}
2019牛客暑期多校訓練營(第七場)
b題 示例1輸入22 1 2 1 21 0 1 輸出no yes就差一點點就打出來了嚶嚶嚶 include include include include include define ll long long using namespace std intmain else if n 1 else...
2020牛客暑期多校訓練營 第七場
可以看成把乙個m n m nm n的長方形劃成若干個寬為1 11的矩形,使得存在兩種分割方法能恰好填滿長和寬。然後只要不斷在矩形裡劃分正方形就行了。include using namespace std typedef long long ll intmain for int i 1 i n i a...
2020牛客暑期多校訓練營(第七場)
b題 傳送門 link 題意 有n m個口罩,需要要把它們裝到一些箱子裡面,要使箱子數盡可能少,並且滿足兩個條件,這些箱子可以分成m組,每組n個口罩,或者分成n組,每組m個口罩。思路 分配方案其實就是乙個迭代的過程。為了使得箱子數最少,每個箱子就應該盡可能的多裝。每次優先裝min n,m 個箱子,每...