题意
这题比较简单,就是给出一个值val和一个字符串str[n],要求出一个由0,1组成的数串num[n],满足
F(0)*num[0]*2^0+F(1)*num[1]*2^1+…+F(n)*num[n]*2^n = val,str[n]若为p,F(n)为1,反之为-1.
比如说第二个样本,10和ppnn,可求得1*2^3 + 1*2^2 - 1*2^1 - 0*2^0 = 10,所以所求数串为1110.
分析
我们可以通过逆推的方式来求这个数。比如10(1010)=1*2^3 + 1*2^2 - 1*2^1 - 0*2^0,
10 - 1*2^3 - 1*2^2 + 1*2^1 + 0*2^0 = 0.
从0位开始,每确定一位,便右移一位。
- (1010),原数0位为0
系数-1,10(1010) + 0*2^0 = 10(1010) - (1010),原数1位为1
系数-1,10(101)+ 1*2^1 = 12(1100) - (1100),原数2位为1
系数1,3(1100) - 1*2^2 = 8(1000) - (1000),原数3位为1
系数1,8(1000) - 1*2^3 = 0
求得原数为12(1110)
代码如下:
Memory: 240K Time: 0MS Length:27LINES
#include<iostream>
using namespace std;
int main()
{
long long number;
int cases, length;
char letter[65]; //先装系数字符串,再装结果。
cin >> cases;
while (cases--)
{
cin >> length >> letter >> number;
unsigned long long num = number > 0 ? number : (~number) + 1;//注意负数
for (int i = length - 1; i >= 0; --i, num >>= 1)
{
char ch = letter[i];
letter[i] = (num & 1) + 48;
if (num & 1)
{
if (number > 0) num += ch == 'n' ? 1 : -1;
else num += ch == 'p' ? 1 : -1;
}
}
if (num == 0) cout << letter << endl;
else cout << "Impossible" << endl;
}
return 0;
}