Problem:
MathJax.Hub.Config({
tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']]}
});

A: 秤 / Steelyard

問題文

情太くんは長さ $2L$ の棒を使って下の図のような秤を作った．

棒には等間隔に $2L+1$ 個の穴があけられ，左から順に $-L, -L+1, \cdots, -1, 0, 1, \cdots, L-1, L$ という番号が付けられている．そして $0$ 番の穴の場所を天井から紐で吊るしてある．

情太くんは，秤の穴に $N$ 個のおもりを吊るした．$i$ 番目のおもりを吊るした穴の番号は $x_i$ で，おもりの重さは $w_i$ である．おもりが $1$ つも吊るされない穴や，複数のおもりが吊るされる穴も存在しうる．

情太くんが吊るしたおもりによっては，秤が傾いているかもしれない．姉の立子さんは，追加でいくつかの重りを吊るすことで秤を水平にしたい (おもりの座標と重さ積の総和が $0$ になるとき秤は水平になる)．条件を満たすおもりの吊るし方を $1$ つ出力しなさい．候補が複数ある場合はどれを出力してもよい．

入力

$L$

$N$

$x_1 \ w_1$

$\vdots$

$x_N \ w_N$

入力の制約

$1 \leq L \leq 30$

$1 \leq N \leq 30$

$|x_i| \leq L$

$1 \leq w_i \leq 30$

全て整数

出力

答えは次のような形式で出力せよ．
$1$ 行目の $N’$ は立子さんが吊るしたおもりの数である．
$1+i$ 行目の $x_i’, w_i’$ は，それぞれ立子さんが吊るしたおもりの位置と重さである．

$N'$

$x_1' \ w_1'$

$\vdots$

$x_N' \ w_N'$

出力の制約

立子さんが追加で吊り下げるおもりは，以下の条件を満たす必要がある.

$0 \leq N' \leq 50000$

$|x_i'| \leq L$

$1 \leq w_i' \leq 50000$

全て整数

サンプル

サンプル入力1

3
3
1 1
2 1
3 1

サンプル出力1

1
-3 2

他にも，例えば以下のような出力も正解として扱われる.

2
-3 1
-3 1

これらを図示すると次のようになる．

サンプル入力2

3
3
1 1
0 2
-1 3

サンプル出力2

1
2 1

サンプル入力3

10
4
1 2
2 3
-7 1
-1 1

サンプル出力3

0

秤は最初から釣り合っていることもある．

Solution in JAVA (judge verdict: Accepted)

import java.util.*;
import java.io.*;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int L = sc.nextInt();
		int N = sc.nextInt();
		int[] x = new int[N];
		int[] w = new int[N];
		for(int i = 0; i < N; i++) {
			x[i] = sc.nextInt();
			w[i] = sc.nextInt();
		}
		int l = 0;
		int r = 0;
		
		for(int i = 0; i < N; i++) {
			if(x[i] == 0) continue;
			if(x[i] < 0) {
				l += -x[i] * w[i];
			}
			else {
				r += x[i] * w[i];
			}
		}
		int aN = 0;
		ArrayList<Integer> xn = new ArrayList<Integer>();
		ArrayList<Integer> wn = new ArrayList<Integer>();
		if(l == r) {
			aN = 0;
		}
		else if(l < r) {
			while(r - l > 50000) {
				aN++;
				xn.add(-1);
				wn.add(50000);
				l += 50000;
			}
			aN++;
			xn.add(-1);
			wn.add(r - l);
		}
		else {
			while(l - r > 50000) {
				aN++;
				xn.add(1);
				wn.add(50000);
				r += 50000;
			}
			aN++;
			xn.add(1);
			wn.add(l - r);
		}
		System.out.println(aN);
		for(int i = 0; i < aN; i++) {
			System.out.println(xn.get(i) + " " + wn.get(i));
		}
		
	}
}