URAL 1117 - Hierarchy(遞推或遞歸)

數據量不大,可以遞推出所有1——2^k的結果,然後可以把過程分解

首先找到比n小的最大的2^k,然後從2^k繼續計算,2^k到n即可轉化爲1到n-2^k

從i到j的時間可表示成從1到i的時間和從1到j的時間的差的絕對值。

#include <stdio.h>
#define LL long long
LL d[35];

void init()
{
    d[1]=0;
    d[2]=0;
    for(int i=3;i<=31;i++)
    {
        d[i]=d[i-1]*2+2*(i-2);
    }
    for(int i=1;i<=31;i++)
    {
        d[i]+=(i-1);
    }
}
LL abs(LL a,LL b){return a-b>0?a-b:b-a;}
LL solve(LL x)
{
    LL ans=0;
    LL k=x;
    for(int i=31;i>=0;i--)
    {
        if(x>=(1LL<<i))
        {
            x-=1LL<<i;
            ans+=d[i];
            if(x>0)ans+=i-1;
        }
    }
    return ans;
}
int main()
{
    LL a,b;
    LL k,t;
    init();
    scanf("%I64d%I64d",&a,&b);
    printf("%I64d\n",abs(solve(b),solve(a)));
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章