题目大意:有两种气球,红气球经过一个小时候可以变成3个红气球和1个蓝气球,蓝气球经过一个小时候变成4个蓝气球。k == 0时,只有一个红气球,现在给出k,a,b,问k小时后,a行到b行有多少个红气球
解题思路:设g(i,k)为第k小时,前i行有多少个红气球,
可得转换式:
当i为偶数时,g(i,k) = g(i/2,k-1)
当i为奇数时:g(i,k) = g(i/2,k-1) + f(i,k)
这里的f(i,k)表示第k小时,第i行有都少个红气球
当i为奇数时,f(i,k) = f((i + 1) / 2, k - 1) * 2
当i为偶数时,f(i,k) = f(i / 2, k - 1)
#include<cstdio>
#include<cstring>
long long f(long long r, long long k) {
if(k == 0)
return 1LL;
if(r % 2 == 0)
return f(r / 2, k - 1);
else
return f((r + 1) / 2, k - 1) * 2;
}
long long g(long long r, long long k) {
if(r == 0)
return 0;
if(k == 0)
return 1LL;
long long ans = g(r / 2, k - 1) * 3;
if( r % 2 )
return ans += f(r,k);
return ans ;
}
int main() {
int test, cas = 1;
int K, B, A;
scanf("%d", &test);
while(test--) {
scanf("%d%d%d", &K, &A, &B);
printf("Case %d: %lld\n", cas++, g(B,K) - g(A-1,K));
}
return 0;
}