zoukankan      html  css  js  c++  java
  • 蟠桃记《快速幂》(两种解法)

    这道题比较容易所以解法也并不唯一。但是我们主要通过这道题讲解快速幂的算法。
    题目如下:
     
    喜欢西游记的同学肯定都知道悟空偷吃蟠桃的故事,你们一定都觉得这猴子太闹腾了,其实你们是有所不知:悟空是在研究一个数学问题!
    什么问题?他研究的问题是蟠桃一共有多少个!
    不过,到最后,他还是没能解决这个难题,呵呵^-^
    当时的情况是这样的:
    第一天悟空吃掉桃子总数一半多一个,第二天又将剩下的桃子吃掉一半多一个,以后每天吃掉前一天剩下的一半多一个,到第n天准备吃的时候只剩下一个桃子。聪明的你,请帮悟空算一下,他第一天开始吃的时候桃子一共有多少个呢?

    Input输入数据有多组,每组占一行,包含一个正整数n(1<n<30),表示只剩下一个桃子的时候是在第n天发生的。Output对于每组输入数据,输出第一天开始吃的时候桃子的总数,每个测试实例占一行。Sample Input

    2
    4

    Sample Output

    4
    22


    数学公式法:
    通过对题中的归纳很容易得到一个数列表达式每一天的为3*2^(n-1)-2;(就是一个高中的数列销项法)
    那么现在最大的工作就交给a^b了。
    快速幂有几种方法在这里不一一讲解。
    快速幂的目的是快速求幂,如果将按普通的算法将会是O(n)的,但是使用快速幂将会是log(n)大大加快速度
    我们知道任何一个数都可以转化为2进制的数字。如11转化位1011,11=2^3*1 + 2^2*0+2^1*1+2^0*1;
    看将一个循环11的变成了计算三次是不是快了很多。
    由于使用到了二进制那么一定会使用>>和&了。
    &运算符通常用于二进制取位操作。还可以判断奇偶数。比如X&1==0;X为偶数。是因为&取出了最后有一位。而二进制中
    最后一位为0必定是偶数。
    >>运算符单纯二进制去掉最后一位。(请查一查相关二进制运算符在算法中的相关使用。本博客也会在后面的文章中补充)

    代码如下:
    int pow(int a,int b)
    {
      int ans=1,base=a;
    while(b!=0)
    {
      if(b&1!=0)
      ans*=base;
      base*=base;
      b>>=1;
    }
    return ans;
    }

    该解法最关键得两个点已经告诉读者所以,只要读者自己去实现代码即可。
    解法二:(制表)
    int num[30];
    num[0]=1;
    for(int i=1;i<30;i++)
    {
    num[i]=(num[i-1]+1)*2;
    }

    该方法只要取出表格即可。但是如果取的数比较少,第一种算法更好。但是第二种方法,在非常多的取数时更有优势,
    因为不需要计算。
  • 相关阅读:
    poj 2488 A Knight's Journey( dfs )
    poj 2676 Sudoku ( dfs )
    poj 3087 Shuffle'm Up ( map 模拟 )
    poj 1426 Find The Multiple( bfs )
    poj 3126 Prime Path( bfs + 素数)
    Atcoder ARC-063
    Atcoder ARC-062
    Atcoder ARC-061
    Atcoder ARC-060
    Atcoder ARC-058
  • 原文地址:https://www.cnblogs.com/damaoranran/p/8654608.html
Copyright © 2011-2022 走看看