HDU_2656

    由于K比较小,Y也在int的范围内,所以可以不断生成比X大一点的排列,直到生成到第K个为止。

#include<stdio.h>
#include<string.h>
int X, K;
struct Integer
{
    int a[32];
    void init(int x)
    {
        int i;
        for(i = 0; i < 32; i ++)
        {
            a[i] = x % 2;
            x /= 2;
        }
    }
    void getnext()
    {
        int i, j, cnt = 0;
        for(i = 0;; i ++)
            if(a[i] == 1)
            {
                if(a[i + 1] == 0)
                {
                    a[i + 1] = 1;
                    for(j = 0; j <= i; j ++)
                    {
                        if(cnt)
                            -- cnt, a[j] = 1;
                        else
                            a[j] = 0;
                    }
                    break;
                }
                ++ cnt;
            }
    }
}integer;
void solve()
{
    int i;
    long long int ans = 0;
    integer.init(X);
    for(i = 0; i < K; i ++)
        integer.getnext();
    for(i = 31; i >= 0; i --)
        ans = ans * 2 + integer.a[i];
    printf("%I64d\n", ans);
}
int main()
{
    for(;;)
    {
        scanf("%d%d", &X, &K);
        if(!X && !K)
            break;
        solve();
    }
    return 0;
}
posted on 2012-04-09 23:35  Staginner  阅读(275)  评论(0编辑  收藏  举报