51nod1169 石子遊戲

2021-07-25 17:25:21 字數 835 閱讀 1539

有n堆石子,第i堆有ai個。

現在要從這n堆石子的任意堆中拿走任意個石子,使得如果兩個人用這n堆石子玩nim遊戲先手必敗。

但要求至少有一堆石子不動。

求方案數對1e9+7取模之後的結果。

n<=100,ai<=1e9

顯然我們只需要異或值為0就好了。

這種東西一般都是考慮位運算啦,對於至少有一堆不取,我們可以容斥,先任意取,在減去全部都取乙個然後任意取的方案數。

現在我們只需要任意取就好了。

為了避免算重,我們列舉乙個k,表示k位以上都是不動的,第k位至少動乙個。

顯然動的話就是把這一位的乙個1變成0.

那麼我們列舉這個1,剩下的算任意取的方案數就好了。

為了避免算重我們要保證這之前的都是不取的。

注意不能都不取。

#include 

#include

#include

#define fo(i,a,b) for(int i=a;i<=b;i++)

#define fd(i,a,b) for(int i=a;i>=b;i--)

using namespace std;

typedef long long ll;

const int n=105,m=30,mo=1e9+7;

int f[n][2],a[n],mi[m],ans,n;

int dp() else

}int t=0,cnt=1;

fd(i,n,1)

if (t)

}return res-1;

}int main()

51nod 1021 石子歸併

n堆石子擺成一條線。現要將石子有次序地合併成一堆。規定每次只能選相鄰的2堆石子合併成新的一堆,並將新的一堆石子數記為該次合併的代價。計算將n堆石子合併成一堆的最小代價。例如 1 2 3 4,有不少合併方法 1 2 3 4 3 3 4 3 6 4 9 10 19 1 2 3 4 1 5 4 5 1 9...

51nod 1021 石子歸併

1021 石子歸併 基準時間限制 1 秒 空間限制 131072 kb 分值 20 難度 3級演算法題 n堆石子擺成一條線。現要將石子有次序地合併成一堆。規定每次只能選相鄰的2堆石子合併成新的一堆,並將新的一堆石子數記為該次合併的代價。計算將n堆石子合併成一堆的最小代價。例如 1 2 3 4,有不少...

51nod 1021 石子歸併

1021 石子歸併 基準時間限制 1 秒 空間限制 131072 kb 分值 20 難度 3級演算法題 n堆石子擺成一條線。現要將石子有次序地合併成一堆。規定每次只能選相鄰的2堆石子合併成新的一堆,並將新的一堆石子數記為該次合併的代價。計算將n堆石子合併成一堆的最小代價。例如 1 2 3 4,有不少...