已知兩個整數n與m,你需要構造兩個整數集合x與y,且需要滿足以下要求:
(1)對所有的xi∈x,滿足1<=xi<=n;對所有的yj∈y,滿足1<=yj<=m; (x與y可以為空集)
(2)x∩y=φ;(但不要求集合x與y的元素個數,只要兩者沒有交集即可)
不妨設構造後的集合x含有n個元素,而集合y有m個元素,令 a=x1 xor x2 xor x3 xor ... xor xn, b=y1 xor y2 xor y3 ... xor ym。其中,xor 為異或運算,並且 稱a與b分別是集合x與集合y的異或和。如果乙個集合為空集,那它的異或和被認為是0。
求對於給定的n與m符合要求(1)、(2)且滿足a
例如:n=2,m=2,則符合條件的x與y有如下四組:
x={} and y=
x={} and y=
x={} and y=
x= and y=
input
一行兩個整數n,m(1 <= n,m <= 2000)。output
乙個整數,即方案個數取mod 1,000,000,007後的結果。input示例
2 2output示例
4
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
數字dp~
我們發現a和b不相等就是在從高往低的某一位i上兩數a的i位為0而b的i位為1,那麼我們可以列舉i。
我們用f[i][j][k]表示i位,a^b==j,b的該位為k的方案數,直接更新即可,那麼ans就是所有j∈[2^i,2^(i+1))的f[max(n,m)][j][1]的和。
#include#include#include#includeusing namespace std;
const int mod=1e9+7;
int n,m,tot,f[2][2048][2],ans,kkz;
void add(int &a,int b)
int main()
{ scanf("%d%d",&n,&m);
tot=max(n,m);
for(int i=0;(1<
51nod1301 集合異或和
已知兩個整數n與m,你需要構造兩個整數集合x與y,且需要滿足以下要求 1 對所有的xi x,滿足1 xi n 對所有的yj y,滿足1 yj m x與y可以為空集 2 x y 但不要求集合x與y的元素個數,只要兩者沒有交集即可 不妨設構造後的集合x含有n個元素,而集合y有m個元素,令 a x1 xo...
51nod 1301 集合異或和(DP)
因為當 a時,會存在在二進位制下的一位,滿足這一位b的這一位是 1 a 的這一位是 0 我們列舉最大的這一位。設為 x 吧。設計狀態。dp i j 1 0 代表考慮了前i個數,異或和為j的情況下 b 的第 x 位為 1 或 0 有多少種情況。然後隨便轉移一下,再隨便統計答案一下就好了。如果不知道如何...
51nod 1577 異或湊數
從左到右一共n個數,數字下標從1到n編號。一共m次詢問,每次詢問是否能從第l個到第r個數中 包括第l個和第r個數 選出一些數使得他們異或為k。資料量比較大。輸入請用掛 1 23 4 5 6 7 8 intread 輸出請用puts input 單組測試資料。第一行乙個整數n 0output m行,每...