uva12627(分治思想)

来源:互联网 发布:淘宝御泥坊适合年龄 编辑:程序博客网 时间:2024/06/03 21:31

题意:0时刻只有一个红色的气球,每一个小时,一个红色的气球会变成三个红色的气球+一个蓝色的气球,而一个蓝色的气球会变成四个蓝色的气球。问k时刻,从A ~B行有多少个红色的气球?
这里写图片描述

思路:先仔细观察红色气球分裂的特点,分裂后右下角四分之一是全蓝,左下角四分之一是以前样子,右上角和左上角和以前一样,相当于数量是两倍,设g(i,j)表示时间i时刻,下面j行的红色球个数。
那么根据我们刚才的分析,很容易得到
这里写图片描述

#include<bits/stdc++.h>using namespace std;typedef long long ll;ll c(int i){   return i==0 ? 1 : 3*c(i-1);}ll g(int k,int i){   if(i==0) return 0;   if(k==0) return 1;   int k2=(1<<(k-1));   if(i<k2) return g(k-1,i);   else return 2*g(k-1,i-k2)+c(k-1);}int main(){   int t=0;   int a,b,k;   while(~scanf("%d%d%d",&k,&a,&b)){      printf("Case %d: %lld\n",++t,g(k,(1<<k)-a+1)-g(k,(1<<k)-b));   }}
0 0