十进制快速幂

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;
}
原文地址:https://www.cnblogs.com/ganster/p/8447031.html