题意: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));
}
}