URAL 1117 - Hierarchy(递推或递归)

来源:互联网 发布:linux新建文件命令 编辑:程序博客网 时间:2024/04/30 11:17

数据量不大,可以递推出所有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 longLL 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;}


原创粉丝点击