BLOPER - Operators

Tags: greedy

Problem

https://vn.spoj.com/problems/BLOPER

https://oj.vnoi.info/problem/BLOPER

Given a set of N integer A = {1, 2, 3, …, N} and a integer S, your task is find a way to insert an operator ‘+’ or ‘-‘ to every neighbor pair of A, that the result of the expression after insert equal to S.

Input

A single line, N and S (1 ≤ N ≤ 500,S≤ 125250)

Output

If there are way(s) to insert, outputs any of them, otherwise outputs “Impossible” (without quotes).

Example

Input
9 5

Output
1-2+3-4+5-6+7-8+9
Input
5 6

Output
Impossible

Tutorial

Trước hết tính tổng sum của N số đầu tiên (sum = N(N+1)/2).

Ta nhận thấy thuật tham lam sau, duyệt i từ N về 1, ta thử đặt dấu – vào trước số i thì sum lúc này giảm đi 2i (do ban đầu tất cả đều là +). Nếu tổng này nhỏ hơn S thì ta không đặt dấu – vào, trái lại thì ta đặt. Ta dùng thuật tham lam này là vì khi trừ đi một số nào đó thì những số sau (nhỏ hơn) thì chắc chắn tồn tại một số đủ cho ta trừ dần sum về S. Nếu sau cùng sum == S thì tồn tại.

Tạo một mảng đánh dấu số nào là -.

Lưu ý là do trước số 1 không được đặt dấu – nên thuật tham lam này sẽ sai trong trường hợp sau : -1+2-3+4-5 == 1-2-3-4+5

Do đó nếu a[1] = 1 (trước số 1 có dấu -) thì ta phải duyệt các số khác để tìm một cặp thích hợp hơn. Do đó thuật này là O(N^2).

Thuật tham lam này luôn đúng.


Submission

BLOPER.cpp