题意
构造题。一个n*m的矩阵,每个格子可以是向右走(R)、向下走(D)或者即可向右走也可向下走(B),求使从(1,1)走到(n,m)的不同走法mod1e9+7与k同余的图。n,m小于50,大小自定。
思路
考虑按2进制拆位。不难发现一个方阵若从起点走到主对角线上任意格子方案数均为1,主对角线以下全为向右向下均可,则最下面一行恰好为1,2,4,6,16,…,只需在下方再补一行,k包含的2的幂填B,不包含的填R即可。
#include <bits/stdc++.h>
using namespace std;
int a[33],mx;
int main() {
int k;
scanf("%d",&k);
if (k == 0) {
printf("2 2\n");
printf("RR\nRR");
return 0;
}
if (k == 1) {
printf("1 1\nR");
return 0;
}
for (int i = 0;i < 31; i++)
if ((1<<i)&k) {
a[i] = 1;
mx = i;
}
printf("%d %d\n",mx+2,mx+1);
for (int i = 0;i <= mx; i++)
printf("B");
printf("\n");
for (int i = 1;i < mx; i++) {
for (int j = 0;j + i < mx; j++)
printf("D");
for (int j = mx-i; j <= mx; j++)
printf("B");
printf("\n");
}
for (int i = 0;i <= mx; i++)
if (a[i])
printf("B");
else
printf("R");
printf("\n");
for (int i = 0;i <= mx; i++)
printf("R");
return 0;
}