十进制快速幂

Posted ganster

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了十进制快速幂相关的知识,希望对你有一定的参考价值。

Problem . 2

Input file: power.in

Output file: power.out

Time limit: 1 second

Memory limit: 256 MB

Mr. Ding 打算考一道比较显然的题目,低头一想,就有了这道题。
Mr. Ding 需要你计算:
3^n mod 10^9 + 8
是不是很简单啊。^_^
Input
只有一行,一个数n。
Output
输出结果。
Sample

input

3

 

output

27
Note
? 对于10% 的数据,1 <= n <= 10^6
? 对于30% 的数据,1 <= n  <=10^18
? 对于70% 的数据,1 <= n <= 10^1000
? 对于100% 的数据,1 <= n <= 10^100000

题解 :

我们看到这道题的数据,非常大,所以单纯的乘或者二进制快速幂是不可能过的,所以我们需要使用十进制快速幂,类比二进制快速幂来学习 

代码 : 

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;

const long long M=1e9+8;

long long mpow(long long a,int p){//快速幂,类比二进制快速幂 
  long long rt=1;
  for (;p;p>>=1,a=a*a%M)
    if (p&1) rt=rt*a%M;
  return (rt%M+M)%M;
}

int main(){
  freopen("power.in","r",stdin);
  freopen("power.out","w",stdout);
  string s1,s;
  cin>>s1;
  s.resize(s1.size());//教训:string类型一开始没有空间,要去访问其空间要先创设出来 ,否则程序会崩溃 
  int n=s1.size();
  for (int i=n-1;i>=0;i--)
    s[n-1-i]=s1[i];
  long long cur=1;
  long long base=3;//base存的是3^(10^i)
  for (int i=0;i<n;i++){
      cur=cur*mpow(base,s[i]-0)%M;
      base=mpow(base,10);
  }
  printf("%I64d",cur);
  return 0;
}

 

以上是关于十进制快速幂的主要内容,如果未能解决你的问题,请参考以下文章

十进制快速幂

快速幂基本模板

模板—十进制快速幂

快速幂的求解-java方法(int范围之内)

快速幂(正儿八经)

数论——快速幂,模运算及快速幂求逆元