2042 不容易系列之二

关键字: 代码分享 杭电100题

问题描述

Problem Description

你活的不容易,我活的不容易,他活的也不容易。不过,如果你看了下面的故事,就会知道,有位老汉比你还不容易。

重庆市郊黄泥板村的徐老汉(大号徐东海,简称XDH)这两年辛辛苦苦养了不少羊,到了今年夏天,由于众所周知的高温干旱,实在没办法解决牲畜的饮水问题,就决定把这些羊都赶到集市去卖。从黄泥板村到交易地点要经过N个收费站,按说这收费站和徐老汉没什么关系,但是事实却令徐老汉欲哭无泪:

(镜头回放)

近景:老汉,一群羊

远景:公路,收费站

......

收费员(彬彬有礼+职业微笑):“老同志,请交过路费!”

徐老汉(愕然,反应迟钝状):“锅,锅,锅,锅-炉-费?我家不烧锅炉呀?”

收费员(职业微笑依然):“老同志,我说的是过-路-费,就是你的羊要过这个路口必须交费,understand?”

徐老汉(近镜头10秒,嘴巴张开):“我-我-我知道汽车过路要收费,这羊也要收费呀?”

收费员(居高临下+不解状):“老同志,你怎么就不明白呢,那么我问你,汽车几个轮子?”

徐老汉(稍放松):“这个我知道,今天在家里我孙子还问我这个问题,4个!”

收费员(生气,站起):“嘿!老头,你还骂人不带脏字,既然知道汽车四个轮子,难道就不知道这羊有几条腿吗?!”

徐老汉(尴尬,依然不解状):“也,也,也是4个呀,这有关系吗?”

收费员(生气,站起):“怎么没关系!我们头说了,只要是4条腿的都要收费!”

......

(画外音)

由于徐老汉没钱,收费员就将他的羊拿走一半,看到老汉泪水涟涟,犹豫了一下,又还给老汉一只。巧合的是,后面每过一个收费站,都是拿走当时羊的一半,然后退还一只,等到老汉到达市场,就只剩下3只羊了。

你,当代有良知的青年,能帮忙算一下老汉最初有多少只羊吗?

Input

输入数据第一行是一个整数N,下面由N行组成,每行包含一个整数a(0<a<=30),表示收费站的数量。

Output

对于每个测试实例,请输出最初的羊的数量,每个测试实例的输出占一行。

Sample Input

2
1
2

Sample Output

4
6

问题分析

Problem Analyse

C语言基本语法

Algorithm Analyse

不知道你还记不记得2013题的解法?

本题用循环迭代能0MS 0K过。当然,也同样可以有更神奇的方法。^_^

算法实现

迭代循环体:

for(s = 3; n--; s = (s - 1) * 2);
  printf("%d\n", s);

本题很容易得到它的递推方程:

f(0) = 3;
f(1) = 4;
f(n) = [f(n-1) - 1] × 2;

于是我们得到:

f(n) - 2 = 2 × [f(n-1) - 2];
f(0) - 2 = 3 - 2 = 1;
=>
f(n) - 2 = 2n;
=>
f(n) = 2n + 2;

和2013题一样,这一题也有麻烦的推法。仅做参考用。

f(0) = 3
f(1) = 4;
f(n) = 2f(n-1) - 2 = f(n-1) + 2f(n-2) - 4;

=>

f(n) + f(n-1) - 4 = 2 × [f(n-1) + f(n+2) - 4];

设 g(n) = f(n) + f(n-1) - 4;

则 g(n) = 2 × g(n-1);
   g(1) = f(1) + f(0) - 4 = 3;

∴g(n) = 3 × 2n-1  (n > 0)

∴ f(n)   + f(n-1) = 3 × 2n-1 + 4 ①
  f(n-1) + f(n-2) = 3 × 2n-2 + 4 ②
  ┋
  f(2)   + f(1)   = 3 × 2 + 4
  f(1)   + f(0)   = 3 + 4

把①式减去②式得
  f(n)   = 3 × 2n-2 + f(n-2)
  f(n-2) = 3 × 2n-4 + f(n-4)

这时候,我们需要分类讨论了: 1. n为奇数

  f(n)   = 3 × 2n-2 + f(n-2)
  f(n-2) = 3 × 2n-4 + f(n-4)
  ┋
  f(5)   = 3 × 23 + f(3)
  f(3)   = 3 × 2 + f(1)
  f(1)   = 4

从下往上迭代,得:
  f(n) = 3 × (2n-2 + 2n-4 + ... + 23 + 2) + 4
=>
  f(n) = 3 × 2 × (1 - 4(n-1)/2) ÷ (1 - 4) + 4
=>
  f(n) = 2n + 2
  1. n为偶数
  f(n)   = 3 × 2n-2 + f(n-2)
  f(n-2) = 3 × 2n-4 + f(n-4)
  ┋
  f(4)   = 3 × 22 + f(2)
  f(2)   = 3 + f(0)
  f(0)   = 3

从下往上迭代,得:
  f(n) = 3 × (2n-2 + 2n-4 + ... + 22 + 1) + 3
=>
  f(n) = 3 × 1 × (1 - 4n/2) ÷ (1 - 4) + 3
=>
  f(n) = 2n + 2

又是如此得巧合,还得感叹大自然的美妙。现在我们就得到了这道题目的公式了: f(n) = 2n + 2

参考源码

redraiment使用Emacs Lisp批量迁移《HDU 2040-2049》