洛谷P5601 小D与笔试

本题使用位运算求解。

#include <cstdio>

void p(int n)//难点
{
    int i;
    int flag = 0;
    switch (n) //也可以写几个if和else代替
    {
        case 0 : printf("2(0)");    break;
        case 1 : printf("2");        break;
        default :
            for (i=14; i>=0; i--)
                if (n&((~((~0)<<1))<<i)) //位运算精华
                {
                    if (flag)    printf("+"); //很关键,括号内部已经有一个表达式才能加上+号
                    else        flag++;
                    if (i!=1 && i!=0)
                    {
                        printf("2(");
                        p(i);
                        printf(")");
                    }
                    else
                        p(i);
                }
        break;
    }
    return;
}

int main()
{
    int n; //特别简单
    scanf("%d", &n);
    p(n);
    return 0;
}

如果不用位运算,大规模数据(本题不存在)会超时
如果还想更快,可参照洛谷日报第26期:GCC自带位运算系列函数