题目链接
一道需要推导的递归 可以这么想,用前B行的红色气球的数量减去A-1行的红色球的数量就可以得到第A行到第B行的红色气球的数量。 公式如下
f(k,i)为当k小时时前i行的红气球数 pre[k]时k小时时红气球总数
#include <iostream>
#include <cstdio>
using namespace std;
const int maxn = 40;
int t, k, a, b;
long long pre[maxn];
long long f(int k, int i)
{
if (i == 0)
return 0;
if (k == 0)
return 1;
int k2 = 1 << (k - 1);
if (i >= k2)
return f(k - 1, i - k2) + pre[k - 1]*2;
else
return f(k - 1, i)*2;
}
int main()
{
pre[0] = 1;
for (int i = 1; i < 30; i++)
pre[i] = 3 * pre[i - 1];
// for (int i = 0; i < 30; i++)
// cout << pre[i] << " ";
// cout << endl;
scanf("%d", &t);
int Case = 0;
while (t--)
{
scanf("%d%d%d", &k, &a, &b);
long long result= f(k, b) - f(k, a - 1);
printf("Case %d: %lld\n", ++Case,result );
}
system("pause");
}