传送门
题意:给一个N×MN \times MN×M的空棋盘,每次选取两个曼哈顿距离为3的空格子放上棋子,问最多能放多少个。
1≤N,M≤1e91 \leq N,M \leq 1e91≤N,M≤1e9
暴力讨论
假装N≤MN \leq MN≤M
①N=1N=1N=1
容易得到,详见代码
②N=2N=2N=2
构造几组小的(0表示空)
2×22\times22×2
0 0
0 0
2×32 \times 32×3
1 0 2
2 0 1
2×42 \times 42×4
1 2 3 4
3 4 1 2
2×52 \times 52×5
1 3 2 4 3
5 4 1 5 2
2×62 \times 62×6
1 2 3 1 2 3
4 5 6 4 5 6
2×72 \times 72×7
1 2 3 1 2 3 0
4 5 6 4 5 6 0
由小凯定理 赛瓦维斯特定理,由4和5拼起来最大不能凑出4×5−4−5=114 \times 5-4-5=114×5−4−5=11,即11以上的都能凑出
而8=4+4,9=4+5,10=5+5,11=5+68=4+4,9=4+5,10=5+5,11=5+68=4+4,9=4+5,10=5+5,11=5+6
所以除了2,3,72,3,72,3,7都可以填满
③N>2N>2N>2,NMNMNM为偶数
首先上面凑出了2×42\times 42×4
两个2×32 \times 32×3凑出3×43\times 43×4
这样最大不能凑出2×3−2−3=12\times 3-2-3=12×3−2−3=1,所以所有4×M4\times M4×M都可以凑出来
用MMM个1×61 \times 61×6凑出6×M6 \times M6×M
以两个为单位,所有都可以凑出
所以偶数都可以填满
④N>2N>2N>2,NMNMNM为奇数
首先必须空一格
3×33 \times 33×3
1 2 4
4 0 3
3 1 2
把它从角落上挖掉,剩下的都是偶数……
等等,是5怎么办?
构造啊
3×53 \times 53×5
1 2 3 4 5
6 7 5 6 7
0 1 2 3 4
5×55 \times 55×5
1 2 3 4 5
6 4 1 2 3
7 8 0 7 8
10 11 12 9 5
6 9 10 11 12
完
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cctype>
using namespace std;
int main()
{int n,m;cin>>n>>m;if (n>m) swap(n,m);switch(n){case 1:cout<<m/6*6+2*max(m%6-3,0);break;case 2:switch(m){case 2:cout<<0;break;case 3:cout<<4;break;case 7:cout<<12;break;default:cout<<2*m;break;}break;default:cout<<1ll*n*m/2*2;break;} return 0;
}