CSU-ACM2017暑期训练3-递推与递归 Erratic Expansion
程序员文章站
2022-03-11 23:47:44
...
Erratic Expansion
由题可看出,第
利用这样的性质,可以利用第 A 行及其以下的所有红气球数量减去第 B 行及其以下所有的红气球数量来得到结果。
为此,设计函数
容易看出,如果
如果
这样一来,就可以使用表达式
#include <iostream>
#include <cstdio>
using namespace std;
long long c(int k){
long long ans = 1;
for(int i = 1; i <= k; i++)
ans *= 3;
return ans;
}
long long g(int k, int i){
if(k==0 && i == 1)
return 1;
else if(k == 0)
return 0;
if(i == ((1<<k) + 1)){
return 0;
}
if(i > (1<<(k - 1))){
return g(k - 1, i - (1<<(k - 1)));//返回
}
else{
return g(k - 1, i) * 2 + c(k - 1);
}
}
int main(){
int t;
while(cin >> t){
for(int i = 1; i <= t; i++){
int k, a, b;
scanf("%d%d%d", &k, &a, &b);
printf("Case %d: %lld\n", i, g(k,a) - g(k,b+1));
}
}
return 0;
}