이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
/*
Code for problem B by cookiedoth
Generated 01 Aug 2019 at 02.00 P
СТРОИМ СТЕНУ РАБОТЯГИ!
█▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
█═╩═╦═╩═╦═╩═╦═╩═╦═╩═╦═╩═╦═╩═█
█═╦═╩═╦═╩═╦═╩═╦═╩═╦═╩═╦═╩═╦═█
█═╩═╦═╩═╦═╩═╦═╩═╦═╩═╦═╩═╦═╩═█
█═╦═╩═╦═╩═╦═╩═╦═╩═╦═╩═╦═╩═╦═█
█═╩═╦═╩═╦═╩═╦═╩═╦═╩═╦═╩═╦═╩═█
█═╦═╩═╦═╩═╦═╩═╦═╩═╦═╩═╦═╩═╦═█
█═╩═╦═╩═╦═╩═╦═╩═╦═╩═╦═╩═╦═╩═█
█═╦═╩═╦═╩═╦═╩═╦═╩═╦═╩═╦═╩═╦═█
█▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
o_O
-_-
~_^
*/
#include <iostream>
#include <fstream>
#include <vector>
#include <set>
#include <map>
#include <bitset>
#include <algorithm>
#include <iomanip>
#include <cmath>
#include <ctime>
#include <functional>
#include <unordered_set>
#include <unordered_map>
#include <string>
#include <queue>
#include <deque>
#include <stack>
#include <complex>
#include <cassert>
#include <random>
#include <cstring>
#include <numeric>
#define ll long long
#define ld long double
#define null NULL
#define all(a) a.begin(), a.end()
#define debug(a) cerr << #a << " = " << a << endl
#define forn(i, n) for (int i = 0; i < n; ++i)
#define sz(a) (int)a.size()
using namespace std;
template<class T> int chkmax(T &a, T b) {
	if (b > a) {
		a = b;
		return 1;
	}
	return 0;
}
template<class T> int chkmin(T &a, T b) {
	if (b < a) {
		a = b;
		return 1;
	}
	return 0;
}
template<class iterator> void output(iterator begin, iterator end, ostream& out = cerr) {
	while (begin != end) {
		out << (*begin) << " ";
		begin++;
	}
	out << endl;
}
template<class T> void output(T x, ostream& out = cerr) {
	output(x.begin(), x.end(), out);
}
void fast_io() {
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
}
/** Fast input-output */
template <class T = int> inline T readInt();						
inline double readDouble();
inline int readUInt();					 
inline int readChar(); // first non-blank character
inline void readWord(char *s); 
inline bool readLine(char *s); // do not save '\n'
inline bool isEof();
inline int getChar(); 
inline int peekChar();
inline bool seekEof();
inline void skipBlanks();
template <class T> inline void writeInt(T x, char end = 0, int len = -1);
inline void writeChar(int x); 
inline void writeWord(const char *s);
inline void writeDouble(double x, int len = 0);
inline void flush();
static struct buffer_flusher_t {
	~buffer_flusher_t() {
		flush();
	}
} buffer_flusher;
/** Read */
static const int buf_size = 4096;
static unsigned char buf[buf_size];
static int buf_len = 0, buf_pos = 0;
inline bool isEof() {
	if (buf_pos == buf_len) {
		buf_pos = 0, buf_len = fread(buf, 1, buf_size, stdin);
		if (buf_pos == buf_len)
			return 1;
	}
	return 0;
}
inline int getChar() { 
	return isEof() ? -1 : buf[buf_pos++];
}
inline int peekChar() { 
	return isEof() ? -1 : buf[buf_pos];
}
inline bool seekEof() { 
	int c;
	while ((c = peekChar()) != -1 && c <= 32)
		buf_pos++;
	return c == -1;
}
inline void skipBlanks() {
	while (!isEof() && buf[buf_pos] <= 32U)
		buf_pos++;
}
inline int readChar() {
	int c = getChar();
	while (c != -1 && c <= 32)
		c = getChar();
	return c;
}
inline int readUInt() {
	int c = readChar(), x = 0;
	while ('0' <= c && c <= '9')
		x = x * 10 + c - '0', c = getChar();
	return x;
}
template <class T>
inline T readInt() {
	int s = 1, c = readChar();
	T x = 0;
	if (c == '-')
		s = -1, c = getChar();
	else if (c == '+')
		c = getChar();
	while ('0' <= c && c <= '9')
		x = x * 10 + c - '0', c = getChar();
	return s == 1 ? x : -x;
}
inline double readDouble() {
	int s = 1, c = readChar();
	double x = 0;
	if (c == '-')
		s = -1, c = getChar();
	while ('0' <= c && c <= '9')
		x = x * 10 + c - '0', c = getChar();
	if (c == '.') {
		c = getChar();
		double coef = 1;
		while ('0' <= c && c <= '9')
			x += (c - '0') * (coef *= 1e-1), c = getChar();
	}
	return s == 1 ? x : -x;
}
inline void readWord(char *s) { 
	int c = readChar();
	while (c > 32)
		*s++ = c, c = getChar();
	*s = 0;
}
inline bool readLine(char *s) { 
	int c = getChar();
	while (c != '\n' && c != -1)
		*s++ = c, c = getChar();
	*s = 0;
	return c != -1;
}
/** Write */
static int write_buf_pos = 0;
static char write_buf[buf_size];
inline void writeChar(int x) {
	if (write_buf_pos == buf_size)
		fwrite(write_buf, 1, buf_size, stdout), write_buf_pos = 0;
	write_buf[write_buf_pos++] = x;
}
inline void flush() {
	if (write_buf_pos) {
		fwrite(write_buf, 1, write_buf_pos, stdout), write_buf_pos = 0;
		fflush(stdout);
	}
}
template <class T> 
inline void writeInt(T x, char end, int output_len) {
	if (x < 0)
		writeChar('-'), x = -x;
	char s[24];
	int n = 0;
	while (x || !n)
		s[n++] = '0' + x % 10, x /= 10;
	while (n < output_len)
		s[n++] = '0';
	while (n--)
		writeChar(s[n]);
	if (end)
		writeChar(end);
}
inline void writeWord(const char *s) {
	while (*s)
		writeChar(*s++);
}
inline void writeDouble(double x, int output_len) {
	if (x < 0)
		writeChar('-'), x = -x;
	int t = (int)x;
	writeInt(t), x -= t;
	writeChar('.');
	for (int i = output_len - 1; i > 0; i--) {
		x *= 10;
		t = std::min(9, (int)x);
		writeChar('0' + t), x -= t;
	}
	x *= 10;
	t = std::min(9, (int)(x + 0.5));
	writeChar('0' + t);
}
int normalize(vector<int> &a) {
	for (int i = 0; i < a.size(); ++i) {
		if (i == (int)a.size() - 1) {
			if (a[i] < 0) {
				for (int j = 0; j < a.size(); ++j) {
					a[j] = -a[j];
				}
				normalize(a);
				return -1;
			}
			if (a[i] > 1) {
				a.push_back(0);
			}
		}
		if (a[i] < 0) {
			int cnt = abs((a[i] - 1) / 2);
			a[i] += 2 * cnt;
			a[i + 1] -= cnt;
		}
		if (a[i] >= 2) {
			int cnt = a[i] / 2;
			a[i] -= 2 * cnt;
			a[i + 1] += cnt;
		}
	}
	while (a.size() > 1 && a.back() == 0) {
		a.pop_back();
	}
	return 1;
}
vector<int> multiply(vector<int> &a, vector<int> &b) {
	vector<int> res((int)a.size() + (int)b.size() - 1);
	for (int j = 0; j < b.size(); ++j) {
		if (b[j]) {
			for (int i = 0; i < a.size(); ++i) {
				res[i + j] += a[i];
			}
		}
	}
	normalize(res);
	return res;
}
int smaller_or_eq(vector<int> &a, vector<int> &b) {
	if (a.size() < b.size()) {
		return 1;
	}
	if (a.size() > b.size()) {
		return 0;
	}
	for (int i = (int)a.size() - 1; i >= 0; --i) {
		if (a[i] > b[i]) {
			return 0;
		}
		if (a[i] < b[i]) {
			return 1;
		}
	}
	return 1;
}
vector<int> divide(vector<int> &a, vector<int> &b, int bits) {
	/*cerr << "divide" << endl;
	output(all(a));
	output(all(b));*/
	vector<int> res(bits), mult;
	for (int i = bits - 1; i >= 0; --i) {
		res[i] = 1;
		mult = multiply(b, res);
		if (!smaller_or_eq(mult, a)) {
			res[i] = 0;
		}
		else {
			//cerr << "put " << i << endl;
			//output(all(mult));
		}
	}
	mult = multiply(b, res);
	if (mult != a) {
		return vector<int> ();
	}
	normalize(res);
	return res;
}
const int mx = 1e6 + 228;
int n;
ll sum_a, sum_b, d[mx], x[mx];
void yes() {
	writeWord("Yes\n");
	exit(0);
}
void no() {
	writeWord("No\n");
	exit(0);
}
const int IQ = 35;
signed main() {
	fast_io();
	n = readInt();
	for (int i = 0; i < n; ++i) {
		ll ai, bi;
		ai = readInt();
		bi = readInt();
		sum_a += ai;
		sum_b += bi;
		d[i] = bi - ai;
	}
	if (sum_b == 0) {
		if (sum_a == 0) {
			yes();
		}
		no();
	}
	//output(d, d + n);
	vector<int> vd(d, d + n);
	int sign = normalize(vd);
	//output(all(vd));
	vector<int> zero = {0};
	if (sign == 1 && vd != zero) {
		no();
	}
	vector<int> to_divide(n, 1);
	vector<int> res = divide(vd, to_divide, IQ);
	if (res.empty()) {
		no();
	}
	//output(all(res));
	for (int i = 0; i < IQ; ++i) {
		x[0] += (1LL << i) * (ll)res[i];
	}
	for (int i = n - 1; i >= 1; --i) {
		x[i] = d[i] + 2 * x[(i + 1) % n];
	}
	for (int i = 0; i < n; ++i) {
		if (x[i] < 0) {
			no();
		}
	}
	yes();
}
컴파일 시 표준 에러 (stderr) 메시지
remittance.cpp: In function 'int normalize(std::vector<int>&)':
remittance.cpp:268:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int i = 0; i < a.size(); ++i) {
                  ~~^~~~~~~~~~
remittance.cpp:271:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int j = 0; j < a.size(); ++j) {
                     ~~^~~~~~~~~~
remittance.cpp: In function 'std::vector<int> multiply(std::vector<int>&, std::vector<int>&)':
remittance.cpp:300:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int j = 0; j < b.size(); ++j) {
                  ~~^~~~~~~~~~
remittance.cpp:302:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    for (int i = 0; i < a.size(); ++i) {
                    ~~^~~~~~~~~~| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |