나무 심기
나무 심기
考虑对每个点的 \(\text{deg}\) 求和,得到的结果必然为偶数,由此得出 \(B\) 为偶数。
考虑 \(B \geq 2\) 的情况,其构型如图:

其中红色是苹果,粉色是桃子,接下来我们默认 \(B=0\)。
考虑 \(A=8,10,12,\dots\),如图:

对于 \(A=4\),如图:

对于 \(A=2,6\),我们声称其无解。
对于 \(A=11,13,15,\dots\),如图:

对于 \(A=7\),如图:

对于 \(A=1\),如图:

对于 \(A=3,5,9\),我们声称其无解。
//Ad astra per aspera
#include<iostream>
#include<cstdio>
using namespace std;
char ch[210][210];
int main(){
int a,b;
scanf("%d %d",&a,&b);
if(b%2==1){
printf("NO\n");
return 0;
}
if(b>=2){
int n=3,m=a+b/2+1;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
ch[i][j]='.';
}
}
for(int i=1;i<=m;i++){
ch[2][i]='O';
}
for(int i=2;i<=b/2;i++){
if(i%2==0){
ch[1][i]='O';
}
else{
ch[3][i]='O';
}
}
printf("YES\n");
printf("%d %d\n",n,m);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
printf("%c",ch[i][j]);
}
printf("\n");
}
return 0;
}
if(a%2==0){
if(a==2){
printf("NO");
}
else if(a==4){
printf("YES\n");
printf("2 2\n");
printf("OO\n");
printf("OO");
}
else if(a==6){
printf("NO");
}
else{
int n=3,m=a/2-1;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
ch[i][j]='.';
}
}
for(int i=1;i<=m;i++){
ch[1][i]='O';
ch[3][i]='O';
}
ch[2][1]='O';
ch[2][m]='O';
printf("YES\n");
printf("%d %d\n",n,m);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
printf("%c",ch[i][j]);
}
printf("\n");
}
}
}
else{
if(a==1){
printf("YES\n");
printf("1 1\n");
printf("O");
}
else if(a==3){
printf("NO");
}
else if(a==5){
printf("NO");
}
else if(a==7){
printf("YES\n");
printf("3 3\n");
printf("OO.\n");
printf("OOO\n");
printf(".OO");
}
else if(a==9){
printf("NO");
}
else{
int n=4,m=(a-3)/2;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
ch[i][j]='.';
}
}
for(int i=1;i<m;i++){
ch[1][i]='O';
ch[3][i]='O';
}
ch[2][1]='O';
ch[2][m-1]='O';
ch[3][m]='O';
ch[4][m-1]='O';
ch[4][m]='O';
printf("YES\n");
printf("%d %d\n",n,m);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
printf("%c",ch[i][j]);
}
printf("\n");
}
}
}
return 0;
}

浙公网安备 33010602011771号