Add twofive.cpp
This commit is contained in:
parent
b78869568e
commit
90b2f1c24c
73
01/twofive.cpp
Normal file
73
01/twofive.cpp
Normal file
|
@ -0,0 +1,73 @@
|
|||
#include <bits/stdc++.h>
|
||||
#define f first
|
||||
#define s second
|
||||
using namespace std;
|
||||
using ll = long long;
|
||||
using ii = pair<int, int>;
|
||||
constexpr int MX = 5;
|
||||
|
||||
char A[MX*MX];
|
||||
bitset<MX*MX> vis;
|
||||
map<vector<int>, int> dp;
|
||||
|
||||
int f(vector<int> & v) {
|
||||
for (int i = 1; i < MX; ++i) if (v[i-1] < v[i]) return 0;
|
||||
for (int i = 0; i < MX; ++i) if (v[i] > MX) return 0;
|
||||
|
||||
int sum = 0;
|
||||
for (int i = 0; i < MX; ++i) sum += v[i];
|
||||
if (sum == MX*MX) return 1;
|
||||
|
||||
if (dp.find(v) != dp.end()) return dp[v];
|
||||
|
||||
int ret = 0;
|
||||
for (int i = 0; i < MX; ++i)
|
||||
if (A[i*MX+v[i]] == 'A'+sum || !A[i*MX+v[i]])
|
||||
++v[i], ret += f(v), --v[i];
|
||||
return dp[v] = ret;
|
||||
}
|
||||
|
||||
string getk(int k) {
|
||||
string ret(MX*MX, '0');
|
||||
|
||||
vis.reset();
|
||||
memset(A, 0, sizeof A);
|
||||
for (int i = 0; i < MX*MX; ++i) {
|
||||
for (int j = 0; j < MX*MX; ++j) {
|
||||
if (vis[j]) continue;
|
||||
vis[j] = 1;
|
||||
|
||||
A[i] = 'A'+j;
|
||||
dp.clear();
|
||||
vector<int> v(MX, 0);
|
||||
int tmp = f(v);
|
||||
|
||||
if (tmp >= k) break;
|
||||
k -= tmp;
|
||||
vis[j] = 0;
|
||||
}
|
||||
ret[i] = A[i];
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int main() {
|
||||
if (fopen("in", "r")) freopen("in", "r", stdin), freopen("out", "w", stdout);
|
||||
ios_base::sync_with_stdio(0), cin.tie(0);
|
||||
|
||||
char c; cin >> c;
|
||||
if (c == 'N') {
|
||||
int M; cin >> M;
|
||||
cout << getk(M);
|
||||
}
|
||||
else {
|
||||
string S; cin >> S;
|
||||
int l = 0, h = 1e9;
|
||||
while (l < h) {
|
||||
int m = (l+h)/2;
|
||||
string tmp = getk(m);
|
||||
tmp < S ? l = m+1 : h = m;
|
||||
}
|
||||
cout << l;
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue