제출 #676784

#제출 시각아이디문제언어결과실행 시간메모리
676784Alan앵무새 (IOI11_parrots)C++17
컴파일 에러
0 ms0 KiB
#include "encoder.h"
#include "encoderlib.h"
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

struct BigInt {
	static const ll unit = 1000000000, digit = 9;
	vector<ll> x {0};
	BigInt () {}
	BigInt (vector<ll> y) {
		x = y;
	}
	BigInt (ll y) {
		x.resize(3);
		x[0] = y%unit;
		x[1] = y/unit%unit;
		x[2] = y/unit/unit;
		while (x.back() == 0 && (int) x.size() > 1) x.pop_back();
	}
	BigInt operator+ (BigInt y) {
		BigInt tmp = BigInt(x);
		if (y.x.size() < tmp.x.size()) swap(y, tmp);
		for (int i = 0; i < (int) tmp.x.size(); i++) y.x[i] += tmp.x[i];
		y.x.push_back(0);
		for (int i = 0; i < (int) y.x.size()-1; i++) if (y.x[i] >= 1e9) {
			y.x[i+1] += y.x[i]/unit;
			y.x[i] %= unit;
		}
		if ((int) y.x.size() > 1 && y.x.back() == 0) y.x.pop_back();
		return y;
	}
	BigInt operator* (BigInt y) {
		BigInt tmp = BigInt(x), res (0);
		res.x.resize(y.x.size()+tmp.x.size()+1);
		for (int i = 0; i < (int) y.x.size(); i++) for (int j = 0; j < (int) tmp.x.size(); j++) res.x[i+j] += y.x[i]*tmp.x[j];
		for (int i = 0; i < (int) res.x.size()-1; i++) if (res.x[i] >= 1e9) {
			res.x[i+1] += res.x[i]/unit;
			res.x[i] %= unit;
		}
		while ((int) res.x.size() > 1 && res.x.back() == 0) res.x.pop_back();
		return res;
	}
	bool operator== (BigInt y) {
		if (x.size() != y.x.size()) return false;
		for (int i = 0; i < (int) x.size(); i++) if (x[i] != y.x[i]) return false;
		return true;
	}
	bool operator<= (BigInt y) {
		if (x.size() < y.x.size()) return true;
		if (x.size() > y.x.size()) return false;
		for (int i = (int) x.size()-1; i >= 0; i--) {
			if (x[i] < y.x[i]) return true;
			if (x[i] > y.x[i]) return false;
		}
		return true;
	}
};

BigInt pow (BigInt x, ll p) {
	if (!p) return BigInt(1);
	BigInt t = pow(x, p/2);
	t = t*t;
	return p % 2 == 1 ? t * x : t;
}

BigInt ncr[600][350];

void precomp () {
	for (int i = 0; i < 600; i++) for (int j = 0; j <= min(i, 400); j++) {
		if (j == 0 || j == i) ncr[i][j] = BigInt(1);
		else ncr[i][j] = ncr[i-1][j]+ncr[i-1][j-1];
	}
}

void encode (int n, int m[]) {
	precomp();
	BigInt res (0), rep (0);
	for (int i = 0; i < n; i++) res = res + BigInt(m[i]) * pow(BigInt(256), i);
	int last = 0;
	for (int i = 0; i < n*5; i++) {
			if (i == n*5-1) {
			for (int j = 0; j < 256; j++) if (rep+BigInt(j) == res) {
				send(last+j);
				break;
			}
			break;
		}
		while (rep + ncr[254-last+n*5-i][n*5-i-1] <= res) {
			rep = rep + ncr[254-last+n*5-i][n*5-i-1];
			last++;
		}
		send(last);
	}
}
#include "decoder.h"
#include "decoderlib.h"
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

struct BigInt {
	static const ll unit = 1000000000, digit = 9;
	vector<ll> x {0};
	BigInt () {}
	BigInt (vector<ll> y) {
		x = y;
	}
	BigInt (ll y) {
		x.resize(3);
		x[0] = y%unit;
		x[1] = y/unit%unit;
		x[2] = y/unit/unit;
		while (x.back() == 0 && (int) x.size() > 1) x.pop_back();
	}
	BigInt operator+ (BigInt y) {
		BigInt tmp = BigInt(x);
		if (y.x.size() < tmp.x.size()) swap(y, tmp);
		for (int i = 0; i < (int) tmp.x.size(); i++) y.x[i] += tmp.x[i];
		y.x.push_back(0);
		for (int i = 0; i < (int) y.x.size()-1; i++) if (y.x[i] >= 1e9) {
			y.x[i+1] += y.x[i]/unit;
			y.x[i] %= unit;
		}
		if ((int) y.x.size() > 1 && y.x.back() == 0) y.x.pop_back();
		return y;
	}
	BigInt operator* (BigInt y) {
		BigInt tmp = BigInt(x), res (0);
		res.x.resize(y.x.size()+tmp.x.size()+1);
		for (int i = 0; i < (int) y.x.size(); i++) for (int j = 0; j < (int) tmp.x.size(); j++) res.x[i+j] += y.x[i]*tmp.x[j];
		for (int i = 0; i < (int) res.x.size()-1; i++) if (res.x[i] >= 1e9) {
			res.x[i+1] += res.x[i]/unit;
			res.x[i] %= unit;
		}
		while ((int) res.x.size() > 1 && res.x.back() == 0) res.x.pop_back();
		return res;
	}
	bool operator== (BigInt y) {
		if (x.size() != y.x.size()) return false;
		for (int i = 0; i < (int) x.size(); i++) if (x[i] != y.x[i]) return false;
		return true;
	}
	bool operator<= (BigInt y) {
		if (x.size() < y.x.size()) return true;
		if (x.size() > y.x.size()) return false;
		for (int i = (int) x.size()-1; i >= 0; i--) {
			if (x[i] < y.x[i]) return true;
			if (x[i] > y.x[i]) return false;
		}
		return true;
	}
};

extern BigInt ncr[600][350];
extern BigInt pow (BigInt x, ll p);

void decode (int n, int l, int x[]) {
	BigInt res (0), rep (0);
	vector<int> ans (n);
	sort(x, x+l);
	for (int i = x[l-2]; i < x[l-1]; i++) res = res + 1;
	int last = 0;
	for (int i = 0; i < l-1; i++) for (; last < x[i]; last++) res = res + ncr[254-last+n*5-i][n*5-i-1];
	for (int i = n-1; i >= 0; i--) {
		while (rep + BigInt(ans[i]+1) * pow(BigInt(256), i) <= res) ans[i]++;
		rep = rep + BigInt(ans[i]) * pow(BigInt(256), i);
	}
	for (int i = 0; i < n; i++) output(ans[i]);
}

컴파일 시 표준 에러 (stderr) 메시지

/usr/bin/ld: /tmp/ccCONnQs.o: in function `decode(int, int, int*)':
decoder.cpp:(.text+0x901): undefined reference to `ncr'
/usr/bin/ld: decoder.cpp:(.text+0xc98): undefined reference to `pow(BigInt, long long)'
/usr/bin/ld: decoder.cpp:(.text+0xfd8): undefined reference to `pow(BigInt, long long)'
collect2: error: ld returned 1 exit status