题意:
构造 3 × n 3 \times n 3×n 个长度为 l l l 的字符串,每一位只有 0 , 1 , 2 0,1,2 0,1,2 三个数字,且满足第 i i i 位一共有 n n n 个 0 0 0, n n n 个 1 1 1 , n n n 个 2 2 2
并且使得这些字符串中字典序最大的字符串字典序尽可能小。
题解:
第 1 1 1 位一定有 n n n 个 2 2 2 ,考虑三进制,那么字典序最大的字符串 t t t ≥ 2 × 3 l − 1 + n − 1 \geq 2 \times 3^{l-1} +n-1 ≥2×3l−1+n−1
我们可以使得 t = 2 × 3 l − 1 + n − 1 t=2 \times 3^{l-1} +n-1 t=2×3l−1+n−1 ,并且一定能构造出满足题意的字符串。
我们只需让已经构造出来的以 2 2 2为开头的字符串以如下形式变换:
1.0 − > 1 1.0->1 1.0−>1 1 − > 2 1->2 1−>2 2 − > 0 2->0 2−>0
2. 2. 2. 0 − > 2 0->2 0−>2 1 − > 0 1->0 1−>0 2 − > 1 2->1 2−>1
假设以 2 2 2开头第 i i i 位有 x x x 个 0 0 0 ,那么 1 1 1, 2 2 2 总共有 n − x n-x n−x 个,经过上述变换,就可以满足最终 0 0 0 的个数有 x + n − x = n x+n-x=n x+n−x=n
代码:
#pragma GCC diagnostic error "-std=c++11"
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
#include<stack>
#include<set>
#include<ctime>
#define iss ios::sync_with_stdio(false)
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
typedef pair<int,int> pii;
const int mod=1e9+7;
const int MAXN=5e5+5;
const int inf=0x3f3f3f3f;
int ans[MAXN][20];
int main()
{
int n,l;
cin >> n >> l;
ll x = 2 * pow(3, l - 1);
for (int i = 1; i <= n;i++){
ll tp = x;
vector<int> v;
for (int j = 1; j <= l;j++){
v.push_back(tp % 3);
tp /= 3;
}
reverse(v.begin(), v.end());
x++;
for (int j = 1; j <= l;j++){
ans[i][j] = v[j - 1];
}
}
for (int i = 1; i <= n;i++){
for (int j = 1; j <= l;j++){
if(ans[i][j]==0){
ans[i + n][j] = 1;
ans[i + n * 2][j] = 2;
}
else if(ans[i][j]==1){
ans[i + n][j] = 2;
ans[i + n * 2][j] = 0;
}
else{
ans[i + n][j] = 0;
ans[i + n * 2][j] = 1;
}
}
}
for (int i = 1; i <= 3 * n;i++){
for (int j = 1; j <= l;j++){
printf("%d", ans[i][j]);
}
printf("\n");
}
}