# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
357568 | blue | PIN (CEOI10_pin) | C++17 | 46 ms | 10348 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <iostream>
#include <vector>
using namespace std;
/*
There are 36^4 = 1679616 possibilities for the PIN.
Let them be numbered from 0 to 1679615.
Two PINS have one difference if their
*/
int adj(char c)
{
if(c == '0') return 1;
else if('1' <= c && c <= '9') return (c - '1') + 2;
else return (c - 'a') + 11;
}
int ct[37][37][37][37];
int main()
{
int N, D;
cin >> N >> D;
string S;
vector< vector<int> > T(N, vector<int>(4));
for(int i = 0; i < N; i++)
{
cin >> S;
for(int j = 0; j < 4; j++) T[i][j] = adj(S[j]);
for(int mask = 0; mask < (1 << 4); mask++)
{
ct[(mask & (1 << 0)) ? T[i][0] : 0]
[(mask & (1 << 1)) ? T[i][1] : 0]
[(mask & (1 << 2)) ? T[i][2] : 0]
[(mask & (1 << 3)) ? T[i][3] : 0]++;
}
}
vector<long long> res(5, 0);
vector<int> X;
for(int i = 0; i < N; i++)
{
X = T[i];
res[1] += ct[0][X[1]][X[2]][X[3]];
res[1] += ct[X[0]][0][X[2]][X[3]];
res[1] += ct[X[0]][X[1]][0][X[3]];
res[1] += ct[X[0]][X[1]][X[2]][0];
res[1] -= 4 * ct[X[0]][X[1]][X[2]][X[3]];
}
for(int i = 0; i < N; i++)
{
X = T[i];
res[2] += ct[0][0][X[2]][X[3]];
res[2] += ct[0][X[1]][0][X[3]];
res[2] += ct[0][X[1]][X[2]][0];
res[2] += ct[X[0]][0][0][X[3]];
res[2] += ct[X[0]][0][X[2]][0];
res[2] += ct[X[0]][X[1]][0][0];
res[2] -= 6 * ct[X[0]][X[1]][X[2]][X[3]];
}
res[2] -= 3 * res[1];
for(int i = 0; i < N; i++)
{
X = T[i];
res[3] += ct[0][0][0][X[3]];
res[3] += ct[0][0][X[2]][0];
res[3] += ct[0][X[1]][0][0];
res[3] += ct[X[0]][0][0][0];
res[3] -= 4 * ct[X[0]][X[1]][X[2]][X[3]];
}
res[3] -= 3 * res[1];
res[3] -= 2 * res[2];
for(int i = 0; i < N; i++)
{
X = T[i];
res[4] += ct[0][0][0][0];
res[4] -= ct[X[0]][X[1]][X[2]][X[3]];
}
res[4] -= res[1];
res[4] -= res[2];
res[4] -= res[3];
res[D] /= 2;
cout << res[D] << '\n';
}
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |