求助第6个测试点,整数二进制拆分

P1737 [NOI2016] 旷野大计算

panda_eater @ 2017-07-09 09:07:26

这里说一下我的思路。

对于一个十进制数x,假设x=11

二进制拆分以后答案应为1101(暂时忽略前导0)

那么我可以把这个数右移k位,再左移k位。相当于删除了二进制表示中从后往前的k位数

得到四个数

1101 ...1

1100 ...2

1100 ...3

1000 ...4

用1-2得到从右往左的第1位,2-3得到从右往左第2位,3-4得到第3位,4就是第4位。

然后这些数再进行右移得到每一位是0或者1,高位到低位输出。

写了个源程序,可以支持把输入的一个数二进制拆分。答案根据程序的思路来输出,但是莫名WA掉...

请求同学帮忙检查,感激不尽。

//checker
#include<bits/stdc++.h>
#define fo(i,j,k) for(i=j;i<=k;i++)
using namespace std;
const int mxn=5005;
int x[mxn];
int main()
{
    freopen("nodes6.out","w",stdout);
    int i,j;
    scanf("%d",&x[1]);
//    printf("I\n");
    fo(i,2,32)
    {
        x[i]=x[1]>>(i-1);
 //       printf("> 1 %d\n",i-1);
    }
    fo(i,33,63)
    {
        x[i]=x[i-31]<<(i-32);
 //       printf("< %d %d\n",i-31,i-32);
    }
    fo(i,64,94)
    {
        x[i]=-x[i-31];
 //       printf("- %d\n",i-31);
    }
    x[95]=x[1]+x[64];//printf("+ 1 64\n");
    fo(i,96,125)
    {
        x[i]=(x[i-63]+x[i-31]);
  //      printf("+ %d %d\n",i-63,i-31);
    }
    int cnt=30,tmp=125;
    fo(i,126,156)
    {
//        printf("> %d %d\n",tmp,cnt);
        x[i]=x[tmp]>>cnt;
        tmp--,cnt--;
    }
 //   puts("O 32");
 //   fo(i,126,156) printf("O %d\n",i);
    printf("ANS\n\n");
    printf("%d",x[32]);
    fo(i,126,156) printf("%d",x[i]);
    return 0;
}

|