比较简单的递归问题。对于第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; }
时间: 2024-11-08 15:31:22