您的位置:首页 > 其它

Codeforces Round #347 (Div. 2) B. Rebus

2016-05-14 00:03 393 查看
You are given a rebus of form ? + ? - ? + ? = n, consisting of only question marks, separated by arithmetic operation '+' and '-', equality
and positive integer n. The goal is to replace each question mark with some positive integer from
1 to n, such that equality holds.

Input
The only line of the input contains a rebus. It's guaranteed that it contains no more than
100 question marks, integer
n is positive and doesn't exceed 1 000 000, all letters and integers are separated by spaces, arithmetic operations are located only between question marks.

Output
The first line of the output should contain "Possible" (without quotes) if rebus has a solution and "Impossible" (without quotes) otherwise.

If the answer exists, the second line should contain any valid rebus with question marks replaced by integers from
1 to n. Follow the format given in the samples.

Examples

Input
? + ? - ? + ? + ? = 42


Output
Possible
9 + 13 - 39 + 28 + 31 = 42


Input
? - ? = 1


Output
Impossible


Input
? = 1000000


Output
Possible
1000000 = 1000000


分析:设加号有 a - 1个,减号有b个,那么当且仅当a - b*n <= n <= a*n - b 时有解,解可以二分出加减的总值后构造出。

#include <cstdio>
#include <iostream>
using namespace std;
string S;
int n,tot,a,b,f[105],A[105],B[105];
int main()
{
a++;
while(cin>>S && S!="=")
{
if(S == "?") continue;
if(S == "+") a++,f[++tot] = 1;
else b++,f[++tot] = -1;
}
cin>>n;
if(a*n - b < n || a - b*n > n)
{
cout<<"Impossible"<<endl;
return 0;
}
else cout<<"Possible"<<endl;
int s = b,t = b*n;
while(s != t)
{
int mid = (s + t) / 2;
if(mid + n >= a) t = mid;
else s = mid + 1;
}
s -= b;
for(int i = 1;i <= b;i++)
{
B[i] = 1;
B[i] += min(n-1,s);
s -= min(n-1,s);
}
t += n - a;
for(int i = 1;i <= a;i++)
{
A[i] = 1;
A[i] += min(n-1,t);
t -= min(n-1,t);
}
cout<<A[1];
int nowa = 2,nowb = 1;
for(int i = 1;i <= tot;i++)
if(f[i] == 1) cout<<" + "<<A[nowa++];
else cout<<" - "<<B[nowb++];
cout<<" = "<<n<<endl;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: