51Nod1626 B君的夢境 狀壓dp 矩陣

2022-03-31 15:20:51 字數 1105 閱讀 4605

首先考慮形象的想象本題中的思維空間。我們把整個 2*2*3*n 的四維空間看作 n 個 2*2*3 的三維空間順次排列。考慮到 1*1*1*2 的方塊,我們如果把邊長 2 放在第 4 維上,相當於是填充了連續兩個三維空間的對應位置。否則,邊長 1 就放在了第 4 維上,相當於在乙個三維空間中填充 1*1*2 的方塊。

然後我們考慮狀壓 dp 。狀態壓縮當前三維空間的被填充狀態。顯然有 $2^=4096$ 種情況。然後,我們考慮通過旋轉、對稱刪除一些重複的狀態,通過黑白染色刪除一些沒用的狀態,最後剩下的狀態數很少了。然後矩陣快速冪即可。

如果要更加具體地了解如何刪除狀態,參見**或者原題的題解。

#include #define hash(a,b,c) ha[a][b][c]

using namespace std;

typedef long long ll;

const int n=105,mod=1e9+7;

ll n;

int t=0,a[n],min[1<<12],id[1<<12],ha[5][5][5];

struct mat

mat(int x)

}m(0);

mat operator * (mat a,mat b)

mat pow(mat x,ll y)

void swapd(int &v,int i,int j)

int calc(int s)

} return res;

}int dx[6]=,_x[6];

int dy[6]=,_y[6];

int dz[6]=,_z[6];

void getxyz()

void getm(int s,int v,int t)

getm(s,v,t+1);

int x=_x[t],y=_y[t],z=_z[t],xx,yy,zz;

if (v>>hash(x,y,z)&1)

return;

for (int i=0;i<6;i++)

}int main()

51NOD 1629 B君的圓錐

1629 b君的圓錐 基準時間限制 1 秒 空間限制 131072 kb 分值 10 難度 2級演算法題 b君要用乙個表面積為s的圓錐將白山雲包起來。b君希望包住的白山雲體積盡量大,b君想知道體積最大可以是多少。注意圓錐的表面積包括底面和側面。input 一行乙個整數,表示表面積s。1 s 10 9...

51nod 1714 B君的遊戲

題意 玩兒遊戲,可以把乙個數x變成xi,xi x x,問先手能不能贏 題解 這個轉換,也就說把x變成二進位制後,只能在原來有1的位置上寫1,並且,至少有一位不寫1 很容易想到,乙個數的sg值,只跟這個數的二進位制有多少個1有關,轉換也很好想,但時間肯定來不及 其實只要把所有 64 的sg值打表出來即...

51nod 1629 B君的圓錐

1629 b君的圓錐 基準時間限制 1 秒 空間限制 131072 kb 分值 10 難度 2級演算法題 b君要用乙個表面積為s的圓錐將白山雲包起來。b君希望包住的白山雲體積盡量大,b君想知道體積最大可以是多少。注意圓錐的表面積包括底面和側面。input 一行乙個整數,表示表面積s。1 s 10 9...