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;
}
时间: 2024-11-08 15:31:22

bjfu1277 简单递归的相关文章

简单递归练习

1 #include<stdio.h> 2 //#include<stdlib.h> 3 int jiecheng(int i){ 4 //①算n! 5 if(i==1)return 1; 6 return i*jiecheng(i-1); 7 } 8 int Fibonacci(int i){ 9 //②算第i项斐波那契数列 10 if(i==1)return 1; 11 if(i==0)return 0; 12 return Fibonacci(i-1)+Fibonacci(i

斐波那契数列的实现(简单递归和动态规划)

斐波那契数列的实现(简单递归和动态规划) 一.简单递归的实现 1 #include "stdafx.h" 2 #include <string> 3 using namespace std; 4 int f(int n) 5 { 6 if (n == 0) 7 { 8 return 0; 9 } 10 if (n == 1) 11 { 12 return 1; 13 } 14 return f(n - 1) + f(n - 2); 15 } 16 int _tmain(in

简单递归后台代码

void Page_Load(object sender, EventArgs e) { BindTree(0, null); } //一个方法从数据库中查询数据 DataTable dt=QueryTable("select * from t_NewsClass") public void BindTree(int Pid,TreeNode nodes) { foreach(DataRow dr in dt.Rows) { if(Convert.ToInt32(dr["Pa

POJ - 3087 Shuffle&#39;m Up (简单递归)

题意:将两个字符串模拟洗牌的操作合并问是否能得打答案,以及中间经过的次数,如果不能则输出-1 思路:这是一道模拟题,所以只需要写一个模拟操作,不断循环即可.同时还要判断循环结束条件(递归结束条件),如果自己手写一个例子的话就会发现其在不超过2*n(n为长度)次数就会洗回来 完整代码: #include <iostream> #include <cstdio> #include <cstring> #include <string> using namespa

java应用简单递归

毕业后就怎么学过算法,还在上学的时候学过数据结构,现在基本上都还给老师了,可惜老师学费没有还给我... 情景: 类似于给定一个数字,算他由多少个数字组成,比如:36 现在有10.5.1 ,那么最佳帅3个10,1个5,1个1组成(默认优先取最大).因为我们这边业务上面需要开发票,有的时候不想一个一个算,就让我们写一个.但是他发票的个数不是固定的.无尽的,所以每次就要判断下,如果:36 现在基数还是10.5.1 但是 只让你拿1个10.2个5.若干个1,那么组合应该是:1个10,2个5,16个1,大

一个强悍的极简单递归小例子帮你从程序执行的角度理解递归

1 public class test { 2 public static void main(String[] args) { 3 swap(3); 4 } 5 public static int i=1; //全局变量 6 public static void swap(int a){ //局部变量 7 if(a>0){ 8 a--; 9 System.out.println("第"+i+"层:"); 10 System.out.println("

汉诺塔的简单递归思想

最近在校招打酱油,闲得没事想起了大一学过的汉诺塔,不过那时只知道玩游戏,一次性3~7个玩过了,还是有成就感的呵呵.游戏链接:http://www.7k7k.com/swf/335.htm. 看了网上很多递归方法,像 1 #include<stdio.h> 2 3 void move(int n,char a,char b,char c) 4 { 5 if(n==1) 6 printf("\t%c->%c\n",a,c); 7 else 8 { 9 move(n-1,a

简单递归之我见

递归:1. 就是函数自己直接或间接的调用自己. 也就是说最终要回到自己本身. 2. 就递归而言最重要的就是跳出结构. 因为跳出了才可以有结果 也就是说要有个if return语句.也同时就是临界条件. 3. 递归思想就是将一个问题转换为一个已解决的问题来实现 也就是说 假定递归函数已经写好.将最后前后项的关系写出来.最后递归到已解决的问题(正常情况下就是给定的if结果中)例:1-100: function foo( n ) { if ( n == 1 ) return 1; return n +

简单递归换递推。

//这是递归 #include<iostream> using namespace std; int f(int n) { if(n==0 || n==1) return 1; return f(n-2) + f(n/2); } int main() { int n; cin >> n; cout << f(n) << endl; return 0; } //这是递推 #include<iostream> using namespace std;