考虑一种宽 1 列,长 行的单元,大概长下面这个样子
v
v
v
.
v
.
v
.
v
.
>
先是 个连续的 v
,然后是 个间隔一格的 v
,最后是一个 >
或者 <
。
我们把它当作一个黑盒来看待——这个单元从最上面输入一个信号,从最下面输出一个信号,每次做出 的贡献。并且,这个单元只能被“使用” 次。
于是自然地想到,把这个单元从左到右堆叠 次,把最后一个单元输出的信号返回给第一个单元。
然后冷静分析一下这种构造的总贡献。每个单元每次做 的贡献,一共循环 次,一共 个单元,贡献是 ,能过。
放一下 Generator 的代码。
// 2021.8.8
// Code by LTb
#include <bits/stdc++.h>
using namespace std;
// #define int long long
#define ll long long
#define debug printf("Passing Line %d in function [%s].\n",__LINE__,__FUNCTION__)
#define fi first
#define se second
inline int read(){
int x=0,f=1;
char ch;
while(ch<'0'||ch>'9') {if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') {x=x*10+ch-'0';ch=getchar();}
return f*x;
}
inline void chmax(int &x,int y){x=max(x,y);}
inline void chmin(int &x,int y){x=min(x,y);}
const int MOD = 998244353;
inline int add(int x,int y){return(x+y>=MOD)?(x+y-MOD):((x+y<0)?(x+y+MOD):(x+y));}
const int MAXN = 105;
int n = 100;
char a[MAXN][MAXN];
signed main()
{
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
a[i][j] = '.';
int k = 32;
for (int i = 1; i <= k; i++)
a[i][1] = 'v';
for (int i = k + 2; i <= n - 1; i += 2)
a[i][1] = 'v';
a[n][1] = '>';
k = 31;
for (int j = 2; j <= n - 1; j++) {
if (j % 2 == 0) {
for (int i = n; i >= n - k + 1; i--)
a[i][j] = '^';
for (int i = n - k - 1; i >= 3; i -= 2)
a[i][j] = '^';
a[2][j] = '>';
} else {
for (int i = 2; i <= k + 1; i++)
a[i][j] = 'v';
for (int i = k + 3; i <= n - 2; i += 2)
a[i][j] = 'v';
a[n][j] = '>';
}
}
k = 32;
for (int i = n; i >= n - k + 1; i--)
a[i][n] = '^';
for (int i = n - k - 1; i >= 3; i -= 2)
a[i][n] = '^';
for (int i = 2; i <= n; i++)
a[1][i] = '<';
p
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++)
cout << a[i][j];
cout << '\n';
}
return 0;
}
碎碎念:提答构造真是太好玩了(