首先考慮形象的想象本題中的思維空間。我們把整個 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...