1023 The Fun Number System

题目:

描述
在ak位2的补码数中,其中位从0到k-1被索引,最高有效位(即位置k-1)的权重是-2 ^(k-1),并且权重为在任何位置i(0≤i<k-1)的位是2 ^ i。例如,3比特数101是-2 ^ 2 + 0 + 2 ^ 0 = -3。负加权位称为negabit(例如2的补码数中的最高位),而正加权位称为posibit。
Fun数字系统是位置二进制数系统,其中每个位可以是negabit或posibit。例如,考虑一个3位有趣数字系统Fun3,其中位置0和2中的位是posibits,位置1中的位是negabit。 (110)Fun3被评估为2 ^ 2-2 ^ 1 + 0 = 3.现在,您将享受Fun数字系统的乐趣!给你一个k位有趣数字系统Funk和一个整数N(可能是负数)的描述。你应该确定Funk中N的表示的k位,或者报告不可能代表给定的N in给定的Funk。例如,Fun3号码系统(上面定义)中-1的表示是011(评估为0-2 ^ 1 + 2 ^ 0),并且
在Fun3中代表6是不可能的。
输入
输入文件的第一行包含一个整数t(1≤t≤10),测试用例的数量,后跟每个测试用例的输入数据。每个测试用例分三个连续给出。在第一行中有一个正整数k(1≤k≤64)。在测试数据的第二行中,存在长度为k的字符串,仅由字母n和p组​​成,描述该测试数据的Fun数系统,其中每个n(p)表示该位置中的位是a negabit(posibit)。
每个测试数据的第三行包含一个整数N(-2 ^63≤N<2 ^ 63),要在Funk编号中表示的数字
系统由您的程序。
输出
对于每个测试数据,您应该打印一行,其中包含表示Funk编号系统中给定数字N的k位字符串,或者当不可能表示给定数字时,单词Impossible。

样例输入

2
3
pnp
6
4
ppnn
10

样例输出

Impossible
1110
#include<cstdio>
#include<cstring>
int main()
{
    int cas;
    scanf("%d",&cas);
    char s[100];
    int d[100];
    bool a[100];
    while(cas--)
    {
        int k;
        scanf("%d",&k);
        scanf("%s",s);
        for(int i=k;i>=1;i--)
        if(s[k-i]=='p')  a[i]=true;
        else  a[i]=false;
        __int64 n;
        scanf("%I64d",&n);
        memset(d,0,sizeof(d));
        for(int i=1;i<=k;i++)
        {
            if(n==0)  continue;
            if(n&1)
            {
                d[i]=1;
                if(a[i])  n=(__int64)(n-1)>>1;
                else n=(__int64)(n+1)>>1;
            }
            else
            {
                d[i]=0;
                n=(__int64)n>>1;
            }
        }
        if(n==0)
        {
            for(int i=k;i>=1;i--)  printf("%d",d[i]);
            printf("\n");
        }
        else
        printf("Impossible\n");
    }
    return 0;
}

来源:https://blog.csdn.net/hqd_acm/article/details/6212599

猜你喜欢

转载自www.cnblogs.com/sweet-ginger-candy/p/11518197.html