UVA12627 Erratic Expansion

来源:互联网 发布:cg软件 编辑:程序博客网 时间:2024/05/18 02:38

开始想利用二叉树去计算每一行的值。。妥妥的T了。。。于是看了题解。。。居然是DP。,果然菜的不行。。。

f(i,j)表示第i天前j行的红色气球的数量和c(i)表示第i天红色气球的总数量,显然c(i)=3^i。那么当j>=2^(i-1)的时候,f(i,j)=f(i-1,j-2^(i-1))+2*c(i-1),当j<2^(i-1)时,f(i,j)=2*f(i-1,j)。

AC代码如下。。

#include <cstdio>using namespace std;typedef unsigned long long ll;ll quick_pow(int a,int b){    ll ans=1,base=a;    while(b)    {        if(b&1)            ans*=base;        b>>=1;        base*=base;    }    return ans;}ll f(int k,int a){    if(k==0)        return a==0? 0:1;    if(a<=(1<<(k-1)))        return 2*f(k-1,a);    else        return f(k-1,a-(1<<(k-1)))+2*quick_pow(3,k-1);}int main(int argc, char const *argv[]){    int T,a,b,k,cnt=0;    scanf("%d", &T);    while(T--)    {        cnt++;        scanf("%d %d %d", &k, &a, &b);        printf("Case %d: %lld\n", cnt, f(k,b)-f(k,a-1));    }    return 0;}


0 0