十进制快速幂

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值