题解:P16480 [GKS 2014 #A] Cut Tiles
Lele_Programmer · · 题解
P16480 题解
思路
考虑如何切割
由于切出来的都是正方形瓷砖,那么我们可以只看其中一条边。
把
不难发现,其实就是直接求
从大到小考虑每一个
复杂度是两个
代码
省去了火车头,添加了一些必要的注释。
int T,n,m;
int s[N];
int rem[M];
i32 main() {
read(T);
_rep(tt,1,T) {
memset(rem,0,sizeof(rem));
read(n,m);
_rep(i,1,n) read(s[i]);
_rsorta(s,1,n); // 降序排序
int ans=0;
_rep(k,1,n) { // for k: 1 -> n
_rrep(i,M-1,s[k]+1) rem[i-1]+=rem[i]*4,rem[i]=0; // for i: M-1 -> s[k]+1
if (!rem[s[k]]) {
ans++;
_rep(i,0,M-1) _rep(j,0,M-1) if (kthbit(m,i) && kthbit(m,j)) { // kthbit(a,b) 获取 a 的第 b 位,最低位为 b=0
int mn=min(i,j),mx=max(i,j);
rem[mn]+=(1LL<<mx)/(1LL<<mn);
}
}
_rrep(i,M-1,s[k]+1) rem[i-1]+=rem[i]*4,rem[i]=0;
rem[s[k]]--;
}
printf("Case #%lld: ",tt);
writeln(ans);
}
return 0;
}