HDOJ2013

Problem Description
 
喜歡西遊記的同學肯定都知道悟空偷吃蟠桃的故事,你們一定都覺得這猴子太鬧騰了,其實你們是有所不知:悟空是在研究一個數學問題!
什麼問題?他研究的問題是蟠桃一共有多少個!
不過,到最後,他還是沒能解決這個難題,呵呵^-^
當時的情況是這樣的:
第一天悟空吃掉桃子總數一半多一個,第二天又將剩下的桃子吃掉一半多一個,以後每天吃掉前一天剩下的一半多一個,到第n天準備吃的時候只剩下一個桃子。聰明的你,請幫悟空算一下,他第一天開始吃的時候桃子一共有多少個呢?
 
Input
輸入數據有多組,每組佔一行,包含一個正整數n(1<n<30),表示只剩下一個桃子的時候是在第n天發生的。

Output
對於每組輸入數據,輸出第一天開始吃的時候桃子的總數,每個測試實例佔一行。
Sample Input
2
4
Sample Output
4
22
關於這道題還是有個小疑點的,比如原來共有4個桃子,第一天吃了3個,那麼剩下一個桃子的事件應該是在第一天發生
的,不知道爲什麼答案要是2.不過這個不影響做題,可以在推導的時候得到總數s和剩下1個的天數n1關係獲得以後,用
n1=n-1替換一下,還是可以求到想要的輸出。
假設第一天吃的時候總數爲s:
第一天吃掉總數的一半加1,剩下的桃子數量爲:s/2-1
第二天吃到前一天剩下數目的一半加1,剩下的數量爲:s/4-3/2
類似,第三天剩下的數目爲:s/8-7/4
第四天剩下的數目爲:s/16-15/8
第五天吃完剩下的數目爲:s/32-31/16
…………
那麼總數s與只剩下1個的天數n1關係爲:
s/(2^n1)-(2^n1-1)/(2^(n1-1))=1,另外用n1=n-1替換,整理
s=3*2^(n-1)-2,也就可以根據只剩下一個桃子時的天數n計算最初總數s了。
附代碼:
#include "stdio.h"
int main(int argc, char* argv[])
{
 long n,total;
 int i;
 while(scanf("%ld",&n)!=EOF)
 {
  total = 1;
  for(i=1;i<n;i++)
  {
   total *= 2;
  }
  total = 3*total-2;
  printf("%ld\n",total);
 }
 return 0;
}
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章