有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,有不少...