【题解】CF329D

考虑一种宽 1 列,长 3k+23k + 2 行的单元,大概长下面这个样子

v
v
v
.
v
.
v
.
v
.
>

先是 kk 个连续的 v,然后是 kk 个间隔一格的 v,最后是一个 > 或者 <

我们把它当作一个黑盒来看待——这个单元从最上面输入一个信号,从最下面输出一个信号,每次做出 k+1k+1 的贡献。并且,这个单元只能被“使用” kk 次。

于是自然地想到,把这个单元从左到右堆叠 nn 次,把最后一个单元输出的信号返回给第一个单元。

然后冷静分析一下这种构造的总贡献。每个单元每次做 3333 的贡献,一共循环 3232 次,一共 100100 个单元,贡献是 33×32×100=10560033 \times 32 \times 100 = 105600,能过。

放一下 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;
}

碎碎念:提答构造真是太好玩了(