# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
95746 | popovicirobert | 질문 (CEOI14_question_grader) | C++14 | 0 ms | 0 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
int fr[13];
int fact[13];
inline void get(int x, int sign) {
int i;
fact[0] = 1;
for(i = 1; i <= 12; i++) {
fact[i] = fact[i - 1] * i;
}
int last = 0;
int sum = 0;
for(i = 1; i <= 6; i++) {
int cur = fact[12 - last - 1] / (fact[6 - i] * fact[6 + i - last - 1]);
for(int j = last + 1; j <= 12; j++) {
if(sum + cur >= x) {
fr[j] += sign;
last = j;
break;
}
else {
sum += cur;
cur = cur * (6 + i - j) / (12 - j);
}
}
}
}
int encode (int N, int x, int y) {
memset(fr, 0, sizeof(fr));
get(x, 1);
get(y, -1);
for(int i = 1; i <= 12; i++) {
if(fr[i] > 0) {
return i;
}
}
}
int fr[13];
int fact[13];
inline void get(int x, int sign) {
int i;
fact[0] = 1;
for(i = 1; i <= 12; i++) {
fact[i] = fact[i - 1] * i;
}
int last = 0;
int sum = 0;
for(i = 1; i <= 6; i++) {
int cur = fact[12 - last - 1] / (fact[6 - i] * fact[6 + i - last - 1]);
for(int j = last + 1; j <= 12; j++) {
if(sum + cur >= x) {
fr[j] += sign;
last = j;
break;
}
else {
sum += cur;
cur = cur * (6 + i - j) / (12 - j);
}
}
}
}
int decode (int N, int q, int h) {
memset(fr, 0, sizeof(fr));
get(q, 1);
return fr[h] > 0;
}