【hdu5100】棋盘覆盖
http://acm.hdu.edu.cn/showproblem.php?pid=5100
题目大意:
用1*k的木块铺n*n的棋盘,求多铺满多少个单位格。
方法:
n < k,显然无解;n >= 2 * k,总可以转换成n - k的情况,因为那一部分总可以铺满,于是最终可以转换成n < 2 * k 情况,这种情况下有两种不同的方式铺,一种是一行行铺,还一种是旋转铺,推推公式就行了。
代码:
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <algorithm> 6 #include <map> 7 #include <vector> 8 #include <stack> 9 #include <string> 10 #include <ctime> 11 #include <queue> 12 #define mem0(a) memset(a, 0, sizeof(a)) 13 #define mem(a, b) memset(a, b, sizeof(a)) 14 #define lson l, m, rt << 1 15 #define rson m + 1, r, rt << 1 | 1 16 #define eps 0.0000001 17 #define lowbit(x) ((x) & -(x)) 18 #define memc(a, b) memcpy(a, b, sizeof(b)) 19 #define x_x(a) ((a) * (a)) 20 #define LL long long 21 #define DB double 22 #define pi 3.14159265359 23 #define MD 10000007 24 #define INF (int)1e9 25 #define max(a, b) ((a) > (b)? (a) : (b)) 26 using namespace std; 27 28 int main() 29 { 30 //freopen("input.txt", "r", stdin); 31 //freopen("output.txt", "w", stdout); 32 int T; 33 cin>> T; 34 while(T--) { 35 int n, k; 36 scanf("%d%d", &n, &k); 37 int nn = n; 38 if(nn >= k) { 39 nn = nn % k + k; 40 int tmp = min(2 * k - nn, nn - k); 41 printf("%d\n", n * n - tmp * tmp); 42 } 43 else printf("0\n"); 44 } 45 return 0; 46 }