题意:给予ppnnp...的字符串及长度k表示的二进制系统,其中k表示共有几位,p表示此位位权为正,n表示此位位权为负。如果最右面一位位p则位权为1即2^0若为n则为-1即-2^0
(1 ≤ k ≤ 64,-2^63 ≤ N < 2^63)
方法:十进制转换成二进制的数学问题的变形,有规律可循,仔细研究会发现其中的递推关系。跟普通的二进制转换差不多,只要在该位为p时,余数为0或1,为n时余数为0或-1即可
思路:从最后一位开始判断,如果N是奇数,那么说明最后一位肯定是1。因为只有最后一位才是0次方,才有可能得到唯一的奇数1。这时如果最后那位是+时,就把N-1再除以2,得到前面的k-1位数;如果最后那位是-时,就把N+1再除以2,得到前面的k-1位数。如果N是偶数,可以断定最后一位是0,那么直接除以2得到前面k-1位得到的数。依次循环至剩下0位即可。如果循环完毕N没有等于0,可以判断为Impossible。
注意:
1.注意负数。2.注意数据范围用long long
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define LL long long
char str[100];
int k,res[100],index=0;
LL N;
int main(){
int T,i;
scanf("%d",&T);
while(T--){
scanf("%d%s%lld",&k,str,&N);
for(i=k-1;i>=0;i--){
if((N%2==1)||(N%2==-1)){
if(str[i]=='p'){
N-=1;
N/=2;
}
else if(str[i]=='n'){
N+=1;
N/=2;
}
res[index++]=1;
}
else{
N/=2;
res[index++]=0;
}
}
if(N!=0) printf("Impossible");
else{
for(i=k-1;i>=0;i--) printf("%d",res[i]);
}
puts("");
index=0;
}
return 0;
}