Problem:
MathJax.Hub.Config({ tex2jax: { inlineMath: [["$","$"], ["\\(","\\)"]], skipTags: ["script","noscript","style","textarea","code"], processEscapes: true }});

問題文

有理数列 $X_0, X_1, X_2, ..., X_N$ がある。各項は以下のように定義される。

$X_0 = 0$

$X_i = X_{i-1}$ $op_i$ $Y_i$ ($1 \leq i \leq N$). ただし $op_i$ は $＋$、$−$、$×$、$÷$のいずれかである。

$X_N$ を求めよ。

入力

入力は以下の形式に従う。与えられる数は全て整数である。

$N$
$o_1$ $Y_1$
$o_2$ $Y_2$
$...$
$o_N$ $Y_N$

$o_i = 1$ のとき $op_i$ は＋、$o_i = 2$ のとき $op_i$ は−、$o_i = 3$ のとき $op_i$ は×、$o_i = 4$ のとき $op_i$ は÷である。

制約

$1 \leq N \leq 10^5$

$1 \leq o_i \leq 4$

$-10^6 \leq Y_i \leq 10^6$

$o_i=4$ ならば $Y_i \neq 0$

$X_N$ は $-2^{31}$ 以上 $2^{31}$ 未満の整数となる。

出力

$X_N$ の値を1行に出力せよ。

Sample Input 1

4
1 1
4 2
2 4
3 4

Output for the Sample Input 1

-14

$X_0 = 0$

$X_1 = X_0 ＋ 1 = 1$

$X_2 = X_1 ÷ 2 = 1/2$

$X_3 = X_2 − 4 = -7/2$

$X_4 = X_3 × 4 = -14$

Solution in C (judge verdict: Accepted)

// AOJ 2353 Four Arithmetic Operations
// 2017.11.27 bal4u@uu

#include <stdio.h>
#define LIM 2147483648LL
#define P   4294967311LL		// ???= 0x???10000000F??¬??¬, prime number??¬
#define P2  4294967309LL		// = P-2
#define M1	20					// 2^20 = 0x100000 = 1048576
#define M2  0xfffff				// = 2^20 -1

#define multi(x,y)	(((((x)*((y)>>M1)%P)<<M1)+(x)*((y)&M2))%P)

char buf[15], *p;
int getint()
{
	int n = 0;
	if (*p == '-') {
		p++; while (*p >= '0') n = (n<<3) + (n<<1) + (*p++ & 0xf);
		return -n;
	}
	while (*p >= '0') n = (n<<3) + (n<<1) + (*p++ & 0xf);
	return n;
}

#if 0
long long multi(long long x, long long y)
{
	return (((x*(y>>M1)%P)<<M1) + x*(y&M2)) % P;
}
#endif

long long power(long long y, long long m)
{
   long long s = 1;
   long long d = y % P;

   while (m > 0) {
      if (m & 1) s = multi(s, d);
      m >>= 1;
      d = multi(d, d);
   }
   return s;
}

int main()
{
	int n, c, y;
	long long x;

	fgets(p=buf, 10, stdin), n = getint();
	x = 0;
	while (n--) {
		fgets(p=buf, 15, stdin);
		c = *p, p+=2, y = getint();
		if (c == '1') {
			x += y; if (x < 0) x += P; if (x >= P) x -= P;
		} else if (c == '2') {
			x -= y; if (x < 0) x += P; if (x >= P) x -= P;
		} else if (c == '3') {
			if (y < 0) x = multi(x, (P+y));
			else       x = (x*y) % P;
		} else {  // div
			if (y < 0) x = multi(x, power(P+y, P2));
			else       x = multi(x, power(y,   P2));
		}
	}
	if (x >= LIM) x -= P;
	printf("%lld\n", x); 
	return 0;
}