bjfu1277 简单递归

比较简单的递归问题。对于第k时刻的图形,可以平均分成四块,左上,右上,左下这三块的图形是一模一样的,右下的那一块不包含红毛僵尸,所以把那三块里的加起来就是结果了。

/*

 * Author    : ben

 */

#include <cstdio>

#include <cstdlib>

#include <cstring>

#include <cmath>

#include <ctime>

#include <iostream>

#include <algorithm>

#include <queue>

#include <set>

#include <map>

#include <stack>

#include <string>

#include <vector>

#include <deque>

#include <list>

#include <functional>

#include <numeric>

#include <cctype>

using namespace std;

typedef long long LL;

LL three[40];



LL work(int k, int a, int b) {

    int side = 1 << (k - 1);

    if (a > side || b < 1) {

        return 0;

    }

    if (a <= 1 && b >= side) {

        return three[k - 1];

    }

    int aa = a - (1 << (k - 2));

    int bb = b - (1 << (k - 2));

    return 2 * work(k - 1, a, b) + work(k - 1, aa, bb);

}



int main() {

    int T, a, b, k;

    three[0] = 1;

    for (int i = 1; i <= 30; i++) {

        three[i] = three[i - 1] * 3;

    }

    scanf("%d", &T);

    for (int t = 1; t <= T; t++) {

        scanf("%d%d%d", &k, &a, &b);

        printf("Case %d: %lld\n", t, work(k, a, b));

    }

    return 0;

}

 

你可能感兴趣的:(递归)